2016-11-11 6 views
-3

10 월 초에 C 프로그래밍을 사용하여 스도쿠를 해결할 수있는 느낌이 들었습니다. 곧 나는 쉬운 일이 없음을 알게되었습니다. 현재 모든 기능을 수행하는 코드를 작성했지만 원하는 결과가 인쇄되지 않거나 평가되는 것을 막는 오류가있는 것으로 보입니다.C에서 역 추적 알고리즘을 사용하여 스도쿠 해결

나는

이 크게 삽입 한 후

#include <stdio.h> 

int row(int i,int j,int a[9][9]); 
int column(int i,int j,int a[9][9]); //function declaration's 
int grid(int i,int j,int a[9][9]); 


int main() 
{ 
    int a[9][9]; 
    int i,j,x; 
    for (i=0;i<9;i++) 
    { 
     for(j=0;j<9;j++) 
     { 
      a[i][j]=0;/*for making all the array values = 0*/ 
      /*So that the stored garbage values will be removed*/ 

     } 
    } 
    /*Entering known elements*/ 
    printf("Enter the elements of known elements leaving the unknown as 0\n"); 
    for (i=0;i<9;i++) 
    { 
     for(j=0;j<9;j++) 
     { 
      scanf("%d",&a[i][j]); 
     } 

    } 

    //If a given grid is '0', lets assign a value 1 and if 1 exists in the same row or column or in ints correspond 3x3 box, increment the value upto 9 

    i=0,j=0,x=1; 
incr: 
    if (a[i][j] == 0) 
    { 
     a[i][j] = x; 
     if(row(i,j,a) && column(i,j,a) && grid(i,j,a)) 
     { 
      a[i][j] = x; 
     } 
     else 
     { 
      x++; 
      if (x>9) 
       x = 1; 
     } 
    } 
    else 
    { 
     while(i < 9) 
     { 
      i++; 
      goto incr; 
     } 
     if (i == 9) 
     { 
      i =1; 
      j++; 
      goto incr; 
     } 
     if (j == 9) 
     { 
      for(i=0;i<9;i++) 
      { 
       for(j=0;j<9;j++) 
       { 
        printf("%d ",a[i][j]); 
       } 
       printf("\n"); 
      } 
     } 
    } 

} 

int row(int i,int j,int a[9][9]) 
{ 
    int m; 
    for(m=0;m<9;m++) 
    { 
     if(m != j) 
     { 
      if(a[i][j] == a[i][m]) 
      { 
       return 0; 
      } 
     } 
    } 
    return 1; 
} 

int column(int i,int j, int a[9][9]) 
{ 
    int m; 
    printf("%d%d",i,j); 
    for(m=0;m<9;m++) 
    { 
     if (m != i) 
     { 
      if(a[i][j] == a[m][j]) 
      { 
       return 0; 
      } 
     } 
    } 
    return 1; 
} 

int grid(int i,int j, int a[9][9]) 
{ 
    int m,n; 

    if(i>=0 && i<=2 && j>=0 && j<=2) /* grid 1*/ 
    { 
     for(m=0;m<=2;m++) 
     { 
      for(n=0;n<=2;n++) 
      { 
       if(i != m && j != n) 
       { 
        if(a[i][j] == a[m][n]) 
        { 
         return 0; 
        } 
       } 
      } 
     } 
     return 1; 
    } 
    if(i>=0 && i<=2 && j>=3 && j<=5) /* grid 2*/ 
    { 
     for(m=0;m<=2;m++) 
     { 
      for(n=3;n<=5;n++) 
      { 
       if(i != m && j != n) 
       { 
        if(a[i][j] == a[m][n]) 
        { 
         return 0; 
        } 
       } 
      } 
     } 
     return 1; 
    } 
    if(i>=0 && i<=2 && j>=6 && j<=8) /* grid 3*/ 
    { 
     for(m=0;m<=2;m++) 
     { 
      for(n=6;n<=8;n++) 
      { 
       if(i != m && j != n) 
       { 
        if(a[i][j] == a[m][n]) 
        { 
         return 0; 
        } 
       } 
      } 
     } 
     return 1; 
    } 
    if(i>=3 && i<=5 && j>=0 && j<=2) /* grid 4*/ 
    { 
     for(m=3;m<=5;m++) 
     { 
      for(n=0;n<=2;n++) 
      { 
       if(i != m && j != n) 
       { 
        if(a[i][j] == a[m][n]) 
        { 
         return 0; 
        } 
       } 
      } 
     } 
     return 1; 
    } 
    if(i>=3 && i<=5 && j>=3 && j<=5) /* grid 5*/ 
    { 
     for(m=3;m<=5;m++) 
     { 
      for(n=3;n<=5;n++) 
      { 
       if(i != m && j != n) 
       { 
        if(a[i][j] == a[m][n]) 
        { 
         return 0; 
        } 
       } 
      } 
     } 
     return 1; 
    } 
    if(i>=3 && i<=5 && j>=6 && j<=8) /* grid 6*/ 
    { 
     for(m=3;m<=5;m++) 
     { 
      for(n=6;n<=8;n++) 
      { 
       if(i != m && j != n) 
       { 
        if(a[i][j] == a[m][n]) 
        { 
         return 0; 
        } 
       } 
      } 
     } 
     return 1; 
    } 
    if(i>=6 && i<=8 && j>=0 && j<=2) /* grid 7*/ 
    { 
     for(m=6;m<=8;m++) 
     { 
      for(n=0;n<=2;n++) 
      { 
       if(i != m && j != n) 
       { 
        if(a[i][j] == a[m][n]) 
        { 
         return 0; 
        } 
       } 
      } 
     } 
     return 1; 
    } 
    if(i>=6 && i<=8 && j>=3 && j<=5) /* grid 8*/ 
    { 
     for(m=6;m<=8;m++) 
     { 
      for(n=3;n<=5;n++) 
      { 
       if(i != m && j != n) 
       { 
        if(a[i][j] == a[m][n]) 
        { 
         return 0; 
        } 
       } 
      } 
     } 
     return 1; 
    } 
    if(i>=6 && i<=8 && j>=6 && j<=8) /* grid 9*/ 
    { 
     for(m=6;m<=8;m++) 
     { 
      for(n=6;n<=8;n++) 
      { 
       if(i != m && j != n) 
       { 
        if(a[i][j] == a[m][n]) 
        { 
         return 0; 
        } 
       } 
      } 
     } 
     return 1; 
    } 
    return 0; 
} 
+0

오, 내 ... 무조건적인 'goto's inside while while loops? 나는 그것이 성취해야만하는 것을 말조차 할 수 없다. –

+1

에러가 기술되고 지역화되지 않았다면, 소스 코드를 [Code Review] (http://codereview.stackexchange.com/)와 정상 회담하는 것이 더 나을 것이다. –

+0

i와 j에 대한 incr 및 goto를 루프로 대체하십시오. –

답변

0

당신의 프로그램이 종료 감사 내가 작성하고 오류를 수정하는 것입니다 코드는, 내 코드를 개발하기 위해 참고 자료로 here 제공하는 알고리즘을 사용 행렬의 값 41 번째 줄의 위치 값을 설정 한 후 또는 j을 적절히 변경 한 다음 goto incr;으로 전화해야합니다.

추신 : 간단한 printf() 문을 사용하는 방법을 배우기 때문에 훌륭한 디버거입니다.