2016-09-19 99 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。