2017-07-12 33 views
0

私は現在、Cを学んでいます。主にプロジェクトオイラーの例があります。インターネット上のいくつかのソースといくつかの自己書き込みコードのうち、 - (<!あなたはすでにそれを知っていない場合は、それをチェックアウト)再帰バックトラック数独ソルバー

、私は50数独を解決する必要がありCプログラムを作りました。私は[スコードの数] [列] [列]のような配列を定義しました。以下は解決関数です。

残念ながら、本当に何も出力し、この時点ではない、非常にイライラさせられる
int solve(int puzzles[50][9][9], int sudokuNumber, int row, int col){ 
int nextNum = 1; 

if (row == 8){ 
    return 1; 
} 

if (puzzles[sudokuNumber][row][col]){ 
    if (col == 8){ 
     if (solve(puzzles, sudokuNumber, row+1, 0)) 
      return 1; 
    } 
    else { 
     if (solve(puzzles, sudokuNumber, row, col+1)) 
      return 1; 
    } 
    return 0; 
} 

for (; nextNum <= 9; nextNum++){ 
    if (isValid(sudokuNumber, row, col, nextNum)){ 
     puzzles[sudokuNumber][row][col] = nextNum; 
     if (col == 8){ 
      if (solve(puzzles, sudokuNumber, row+1, 0)) 
       return 1; 
     } 
     else { 
      if (solve(puzzles, sudokuNumber, row, col+1)) 
       return 1; 
     } 
    } 
} 
} 

...私は明白なダム間違っているのでしょうか? isValidが有効な場合は1を返します。この関数は正しいです。

誰かがこれを見ていただければ本当に感謝します。

+5

なぜ出力が期待されますか?あなたのコードには何も出力されません –

+0

これはプロジェクトオイラー[問題96](https://projecteuler.net/problem=96)です。これはあなた自身の努力と研究によって解決されるべきです。なぜテキストファイルから一度に1つずつ読んで解決できるのか、なぜ50のパズルを3D配列に読み込むのですか?ソリューションスタックが必要になり、一度に50個すべてを読み込むと、不必要に複雑になります。 –

+1

印刷用のスッド機能を作ってみてください。これは、われわれが理解するのに非常に時間がかかり、エラーを指摘しています。あなたの問題の点で特定してください。あなたは医者に行くことができないと言う*ちょっとsomethingsが間違っているが、私は何を知らない!私をチェックしてください。* –

答えて

0

まず、機能シグネチャを修正する必要があると思います。彼らは1つのボードを取るべきであり、ボードのリストを取るべきではありません。 (実際には、すべてのボードをメモリにロードする必要はありません。(0,0)(0,1)、(0,2)の位置すべてのボード)
void solve(int board[][], int row, int col)から - >ボード[行]で始まる解決してください[COL]
bool is_valid(int board[][], int row, int col, int d) - >は、ボードを埋めるために、それは大丈夫です[行] [COL] D

第二と、境界条件はいるようです正しいものではない。行&は8までの値0を取るCOLと仮定すると、それはまたrow==9col==9の代わりに、8

する必要があり、私はあなたがすでに充填されたセルをスキップする必要があると思います。 if(board[row][col] != 0) solve(board, row, col+1)

また、is_validがどのように実装されているかによって、正しく充填されていないことを確認する必要があります。問題では、塗りつぶされていない行は0として表されます。だからボード[行] [col]に1から9までの数字をすべて記入しないとバックトラックする前にボード[行] [col]を0に戻してください。