您提供的solver
函数实际上查看了整个数组,并且 - 如果代码中使用的其他函数正常工作 - 应该实际上解决了这个难题。如果您替换cout << " TRUE TRUE "<<endl;
,cout << "["<<r<<"]["<<c<<"]: "<<i<<endl;
您会注意到所有索引都已检查。
因此,问题必须出在您未提供代码的 3 个函数之一中row_valid
:col_valid
或panel_valid
.
注意: 我不认为在这个特定问题中使用递归是一个好主意。您可能应该只使用 afor
来检查和解决电路板。那会更快更容易。
第一篇文章更新后编辑
row_valid
andcol_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