2017-10-08 73 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功能赛格故障。