solver
あなたが提供した関数は実際に配列全体を表示し、コードで使用されている他の関数が正しく機能していれば、実際にパズルを解決する必要があります。を置き換えるcout << " TRUE TRUE "<<endl;
とcout << "["<<r<<"]["<<c<<"]: "<<i<<endl;
、すべてのインデックスがチェックされていることがわかります。
したがって、問題は、コードを提供しなかった 3 つの関数のいずれかにあるに違いありません: row_valid
、col_valid
またはpanel_valid
.
注: この特定の問題で再帰を使用することは良い考えではないと思います。for
ボードを確認して解決するには、おそらく a を使用して実行する必要があります。その方が速くて簡単です。
最初の投稿が更新された後に編集
および関数はまったく有効ではありませんrow_valid
。すべてのチェックが偽になるため、パーツをcol_valid
チェックすることはできません。c !=i
if ステートメントを次のように変更します。
if (v == rowcol[i][c] && v!=0)
と
if (v == rowcol[r][j] && v!=0)
また、少し変更する必要がありsolver
ます:
bool sudoku :: solver(int r, int c) {
while( r < 9 && rowcol[r][c] !=0) {
c++;
if ( c>8) {
c=0;
r++;
}
if (r > 8) {
return true;
}
}
for (int i=1; i < 10; i++)
{
int nextrow, nextcol;
if (row_valid (r, c, i)&& col_valid(r, c, i)&& panel_valid(r,c, i)) {
rowcol[r][c]=i;
nextrow=r; //save next row and col
nextcol=c;
nextcol++; //increment next col and row
if (nextcol >8) {
nextcol =0;
nextrow++;
}
if(nextcol==0 && nextrow ==9) {
return true; //then it's done
}
if (solver(nextrow,nextcol)) {
return true;
}
else{
rowcol[r][c]=0;
}
}
}
return false;
}
これは私にとってはうまくいくようで、次の出力が得られます。
1 2 3 4 5 6 7 8 9
4 5 6 7 8 9 1 2 3
7 8 9 1 2 3 4 5 6
2 1 4 3 6 5 8 9 7
3 6 5 8 9 7 2 1 4
8 9 7 2 1 4 3 6 5
5 3 1 6 4 2 9 7 8
6 4 2 9 7 8 5 3 1
9 7 8 5 3 1 6 4 2