2017-10-08 71 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運行可執行文件,我只是做了這一點,看到它在f[ sudoku[i][j] ]++;continuare功能賽格故障。