2017-08-23 10 views
0

このSudokuソルバーでfillSudoku関数が何をしているのかを正確に把握しようとしています。 isAvailableは、同じ行、列、およびボックス内の数値で番号が停止するかどうかをチェックします。 main関数はすべてのチェックを実行します。C - Sudoku solver - help関数を理解する

fillSudoku関数が実行している機能/プロセスを誰もが理解していますか?

あなたの質問
int isAvailable(int puzzle[][9], int row, int col, int num) 
{ 
    int rowStart = (row/3) * 3; 
    int colStart = (col/3) * 3; 
    int i, j; 

    for(i=0; i<9; ++i) 
    { 
     if (puzzle[row][i] == num) return 0; 
     if (puzzle[i][col] == num) return 0; 
     if (puzzle[rowStart + (i%3)][colStart + (i/3)] == num) return 0; 
    } 
    return 1; 
} 

int fillSudoku(int puzzle[][9], int row, int col) 
{ 
    int i; 
    if(row<9 && col<9) 
    { 
     if(puzzle[row][col] != 0) 
     { 
      if((col+1)<9) return fillSudoku(puzzle, row, col+1); 
      else if((row+1)<9) return fillSudoku(puzzle, row+1, 0); 
      else return 1; 
     } 
     else 
     { 
      for(i=0; i<9; ++i) 
      { 
       if(isAvailable(puzzle, row, col, i+1)) 
       { 
        puzzle[row][col] = i+1; 
        if((col+1)<9) 
        { 
         if(fillSudoku(puzzle, row, col +1)) return 1; 
         else puzzle[row][col] = 0; 
        } 
        else if((row+1)<9) 
        { 
         if(fillSudoku(puzzle, row+1, 0)) return 1; 
         else puzzle[row][col] = 0; 
        } 
        else return 1; 
       } 
      } 
     } 
     return 0; 
    } 
    else return 1; 
} 

int main() 
{ 
    int i, j; 
    int puzzle[9][9]={{0, 0, 0, 0, 0, 0, 0, 9, 0}, 
         {1, 9, 0, 4, 7, 0, 6, 0, 8}, 
         {0, 5, 2, 8, 1, 9, 4, 0, 7}, 
         {2, 0, 0, 0, 4, 8, 0, 0, 0}, 
         {0, 0, 9, 0, 0, 0, 5, 0, 0}, 
         {0, 0, 0, 7, 5, 0, 0, 0, 9}, 
         {9, 0, 7, 3, 6, 4, 1, 8, 0}, 
         {5, 0, 6, 0, 8, 1, 0, 7, 4}, 
         {0, 8, 0, 0, 0, 0, 0, 0, 0}}; 

    if(fillSudoku(puzzle, 0, 0)) 
    { 
     printf("\n+-----+-----+-----+\n"); 
     for(i=1; i<10; ++i) 
     { 
      for(j=1; j<10; ++j) printf("|%d", puzzle[i-1][j-1]); 
      printf("|\n"); 
      if (i%3 == 0) printf("+-----+-----+-----+\n"); 
     } 
    } 
    else printf("\n\nNO SOLUTION\n\n"); 

    return 0; 
} 
+1

ペーパー/鉛筆やデバッガでステップしてみましたか? – KevinDTimm

+0

それほど好奇心ではない「バックトラック」の場合、私はバックトラックがどのように機能し、そこから行くのか理解しています。 –

+1

これはdupです - すでに1度は投稿されました。デバッガを使用してメモを取ることをお勧めします。結果 - 再投稿:( –

答えて

0

誰でもfillSudoku機能がやっている機能/プロセスを理解していますか?

答えははいですが、ほとんどの人は機能/プロセスを理解しています。

あなたの質問を編集して、わかりにくく説明が必要であることを強く示唆することを強くお勧めします。

同じ質問を再投稿しないでください。