2016-09-19 102 views
-3

我通过回溯(有点乱的代码,但我认为它应该工作)做了一个数独求解器,我经历了几次代码,但我不知道它为什么崩溃,我真的很感激它,如果有人可以发现它,谢谢!代码崩溃没有逻辑错误

#include <iostream> 
#define N 25 
using namespace std; 

bool backtrack(int sudoku[N][N],int n); 
bool analyze(int sudoku[N][N],int n); 

/* run this program using the console pauser or add your own getch, system("pause") or input loop */ 

int main(int argc, char** argv) 
{ 
    int sudoku[N][N]; 
    int n=0,i,j; 
    char c=0; 

    cin.get(c); 

    while(c!='\n') 
    { 
    if(c==32) 
    { 
     cin.get(c); 
     sudoku[0][n]=c; 
     continue; 
    } 

    cin.get(c); 
    n++; 
    } 

    // cout<<"n is"<<n<<endl; 
    // cout<<"part 1"<<endl; 

    for(i=1; i<n; i++) 
    { 
    for(j=0; j<n; j++) 
    { 
     cin>>sudoku[n][j]; 
    } 
    } 

    for(i=0; i<n; i++) 
    { 
    for(j=0;j<n;j++) 
    { 
     // cout<<sudoku[n][j]; 
    } 
    } 

    if(backtrack(sudoku,n)) 
    { 
    for(i=0; i<n; i++) 
    { 
     for(j=0; j<n; j++) 
     { 
     cout<<sudoku[i][j]<<" "; 
     } 

     cout<<endl; 
    } 
    } 
    else 
    { 
    cout<<"NO"; 
    } 

    return 0; 
} 

bool analyze(int sudoku[N][N],int n) 
{ 
    int i,j,k,f,g,l,m; 
    int compare[N]={0}; 
    // cout<<"analyze test start"; 

    for(i=0; i<n; i++) 
    { 
    for(j=0; j<n; j++) 
    { 
     if(compare[sudoku[i][j]]==1) 
     { 
     // cout<<"before return false test 1"; 
     return false; 
     } 
     compare[sudoku[i][j]]=1; 
    } 

    for(k=0; k<n; k++) 
    { 
     compare[k]=0; 
    } 
    } 

    for(k=0; k<n; k++) 
    { 
    compare[k]=0; 
    } 

    for(j=0; j<n; j++) 
    { 
    for(i=0; i<n; i++) 
    { 
     if(compare[sudoku[i][j]]==1) 
     { 
     // cout<<"before return false test 2"; 
     return false; 
     } 
     compare[sudoku[i][j]]=1; 
    } 

    for(k=0; k<n; k++) 
    { 
     compare[k]=0; 
    } 
    } 

    for(k=0; k<n; k++) 
    { 
    compare[k]=0; 
    } 

    for(f=0; f<=n; f+=3) 
    { 
    for(g=0; g<=n; g+=3) 
    { 
     for(l=0+f; l<3+f; l++) 
     { 
     for(m=0+g; m<3+g; m++) 
     { 
      if(compare[sudoku[l][m]]==1) 
      { 
      // cout<<"before return false test 3"; 
      return false; 
      } 
      compare[sudoku[l][m]]=1; 
     } 
     } 

     for(k=0; k<n; k++) 
     { 
     compare[k]=0; 
     } 
    } 
    } 
    return true; 
    //cout<<"analyze test finish"; 
} 

bool backtrack(int sudoku[N][N],int n) 
{ 
    int i,j,value=0; 
    // cout<<"backtract test start"; 

    for(i=0; i<n; i++) 
    { 
    for(j=0; j<n; j++) 
    { 
     if(sudoku[i][j]==0) 
     { 
     assign: 
     sudoku[i][j]=value; 
     if(analyze(sudoku,n)) 
     { 
      if(backtrack(sudoku,n)) 
      { 
      return true; 
      } 
      else 
      { 
      sudoku[i][j]=0; 
      } 
     } 
     else 
     { 
      value++; 
      if(value>n) 
      { 
      return false; 
      } 
      goto assign; 
     } 
     } 
     value=0; 
    } 
    } 
    //cout<<"backtract test finish"; 
    return true; 
} 
+1

它崩溃,因为代码有可怕的intendation。对不起,只是开玩笑,请格式化您的代码,以便它是可读的 – user463035818

+1

开始在调试器中运行以捕捉实际崩溃并找到它在代码中发生的位置。 –

+4

解决这些问题的正确工具是您的调试器。在*堆栈溢出问题之前,您应该逐行执行您的代码。如需更多帮助,请阅读[如何调试小程序(由Eric Lippert撰写)](https://ericlippert.com/2014/03/05/how-to-debug-small-programs/)。至少,您应该\编辑您的问题,以包含一个[最小,完整和可验证](http://stackoverflow.com/help/mcve)示例,该示例再现了您的问题,以及您在调试器。 –

回答

0

您正在使用固定数组int sudoku [N] [N]并且从不检查边界。如果任何索引超出了适当的尺寸大小,您可能会遇到问题。如果(n> = N)中断,至少应该添加 ;在你的while(c!='\ n')循环中。 更好的解决方案是动态分配数组或使用std :: vector。