2013-07-24 3 views
-1

이 코드는 해결 된 스도쿠 행렬을 생성해야하지만 while 문은 무한 루프에 넣습니다. while 문을 제거하면 나에게 99 또는 0 값이있는 행렬이 생깁니다. 그리고 난수 하나 하나를 유일하게 생성 할 수 없습니다. 코드를 실행하고 확인하려는 경우 항상 설명문을 제거하십시오.Sudoku 해결 매트릭스 while 문이 무한 루프를 제공합니다

int a[9][9]; 
int b[9][9]; 

int inputvalue(int x, int y, int value) //checks horizontally, vertically and 3*3matrix for conflicts 


{ 

    int i, j; 

    for (i = 0; i < 9; i++) 
    { 
     if (value == a[x][i] || value == a[i][y]) 
      return 0; 
    } 

    for (i = (x/3) * 3; i <= ((x/3) * 3) + 2; i++) 
    { 
     for (j = (y/3) * 3; j <= ((y/3) * 3) + 2; j++) 
      if (b[i][j] == value) 
     return 0; 
    } 
    return value; 
} 

int main() 
{ 
    int i, j, k; 
    unsigned int s; 
    cout << "sudoku\n"; 
    time_t t; 

    s = (unsigned) time(&t); 
    srand(s); 
    for (i = 0; i < 9; i++) 
    { 
     for (j = 0; j < 9; j++) 
     a[i][j] = 99; 
    } 

    for (i = 0; i < 9; i++) 
    { 
     for (j = 1; j <= 9; j++)//j is basically the value being given to cells in the matrix while k assigns the column no. 
     while(a[i][k]==99||a[i][k]==0) 
     { 
      k = rand() % 9; 
      a[i][k] = inputvalue(i, k, j); 
     } 
    } 

    for (i = 0; i < 9; i++) 
    { 
     for (j = 0; j < 9; j++) 
     { 
      cout << a[i][j] << " "; 
     } 
     cout << endl; 
    } 

    return 0; 
    getch(); 
} 
+3

들여 쓰기를 초기화 할 수있는 일반적인 방법입니다. –

+0

사이드 노트 : 알고리즘이 나에게 잘못되었습니다. 배열을 임의의 숫자로 채우려고합니다. 이전 선택이 호환되지 않는 경우 (예 : 후자의 선택을 취소 한 경우). 그러면 무한 루프로 다시 돌아올 거라고 생각합니다. 뒤로 추적하는 방법이 필요합니다 (즉, 잘못된 선택을 취소하십시오). 해결책이없는 스도쿠를 주면 어떻게되는지 생각해보십시오. – hivert

답변

2

대신 여기 평등 ==의, 할당 =을 사용하고 있습니다 :

while(a[i][k]=99||a[i][k]=0) 
      ^  ^

이 있어야한다 :

while(a[i][k]==99||a[i][k]==0) 

a[i][k]=99 항상 99 이후 true로 평가됩니다은 0이 아닌 원래 코드가 나를 위해 gcc 아래에 컴파일되지 않지만 그렇기 때문에 실행중인 코드에 괄호가 있거나 약간 다릅니다.

또한 초기화되기 전에 while 루프에서 k을 사용하면 정의되지 않은 동작이므로 각 루프 반복마다 끊임없이 변경되는 k에 대해 종료 논리가 의미가 있다는 점이 분명하지 않습니다.

무한 루프의 또 다른 소스는 inputvalue입니다. 일부 경우에는 0이 반환되므로 무한 루프가 발생하지 않도록 약간 조정해야합니다.

또한, srand(time(NULL));이 코드를 더 읽기 쉽게 도움이 될 의사 난수 생성기를

+0

j 루프는 행렬의 셀에 값을 할당하고 0 값을 필요로하지 않기 때문에 정확합니다. 그리고 동등 연산자를 사용하면 도움이되지 않지만 여전히 infinte 루프에 들어갑니다. –

+0

while 문을 제거한 코드를 추가 했으니 이제 실행 해보십시오. 그것은 작동해야합니다. –

+0

@KaranSingh 업데이트 된 답변, 질문 코드에서 'while'루프를 제거한 것을 볼 수 있지만 질문은 더 이상 의미가 없습니다. 질문에 대한 업데이트를 원하면 미래의 독자가 완전히 혼란스러워 질 것이므로 질문 끝 부분에 추가해야합니다. –