2016-09-19 1 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

코드에 끔찍한 의도가 있기 때문에 충돌이 발생합니다. 죄송합니다. 코드를 읽을 수 있도록 포맷하십시오. – 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를 사용하는 것입니다.

관련 문제