2017-10-08 1 views
0

私はバックトラックを使用して、スドクソルバーに取り組んでいます。なぜなら私のコードブロックが再帰を使用することができない理由がわからないからです。つまり、関数が、たとえプログラムが再帰を書いたコード行に到達したとしても、それ自身を呼び出さないということです。あたかも何もなかったかのようにプログラムはそのまま続きます。関数の再帰は失敗します

#include <bits/stdc++.h> 

using namespace std; 

ifstream in("data.in"); 
ofstream out("data.out"); 

int sudoku[10][10]; 
int f[10]; 
vector< pair<int, int> > v; 

bool continuare(int pas){ 

    int x = v[pas].first; 
    int y = v[pas].second; 

    for(int i = x; i <= 9; i++) 
     f[ sudoku[i][y] ]++; 
    for(int i = x - 1; i >= 1; i--) 
     f[ sudoku[i][y] ]++; 
    for(int j = x + 1; j <= 9; j++) 
     f[ sudoku[x][j] ]++; 
    for(int j = x - 1; j >= 1; j--) 
     f[ sudoku[x][j] ]++; 

    for(int i = x - 3 + x%3, c1 = 0; c1 < 3; c1++, i++) 
     for(int j = y - 3 + y%3, c2 = 0; c2 < 3; c2++, j++) 
      f[ sudoku[i][j] ]++; 

    for(int i = 1; i <= 9; i++){ 
     if(f[i] > 3) 
      return false; 
     f[i] = 0; 
    } 

    return true; 
} 

void afisare(){ 

    for(int i = 1; i <= 9; i++){ 
     for(int j = 1; j <= 9; j++) 
      out<<sudoku[i][j]<<" "; 
     out<<"\n"; 
    } 

} 

void backtracking(int pas){ 

    if(pas > v.size()) 
     afisare(); 
    else 
     for(int i = 1; i <= 9; i++){ 
      sudoku[ v[pas].first ][ v[pas].second ] = i; 
      if(continuare(pas)) 
       backtracking(pas + 1); 
     } 

} 

int main() 
{ 
    for(int i = 1; i <= 9; i++) 
     for(int j = 1; j <= 9; j++){ 
      in>>sudoku[i][j]; 
      if(sudoku[i][j] == 0) 
       v.push_back(make_pair(i, j)); 
     } 

    backtracking(1); 

    return 0; 
} 

気づいたことがあるかもしれませんが、問題はバックトラック()が自分自身を呼び出すときで、何も起こっていないと言います。あなたの質問を解決しているように見えたコメントからコピー

+0

'-g'フラグでコンパイルし、' gdb'に対して実行ファイルを実行すると、私はそれを実行して 'f [sudoku [i] [j]] ++;'で '継続機能。 – Bill

+0

ありがとうございます。今それはうまく働いています – Andrew

答えて

0

-gフラグを使用してコンパイルしgdbに対するあなたの実行可能ファイルを実行し、私はちょうどそれをしたし、それがcontinuare機能にf[ sudoku[i][j] ]++;で障害をSEGことがわかりました。