我已经编写了一个数独求解器,当数据可以解决时它可以正常工作。但是当数据无法解析时,它会在回溯时更改拼图的原始数字。
bool Sudoku::solve(int row, int col){
if (board[row][col] != 0){
int next_col = col;
int next_row = row;
next_col++;
if (next_col > 8){
next_row++;
next_col = 0;
}
if (next_row > 8){
return true;
} else {
if (solve(next_row, next_col))
return true;
}
}
for (int number = 1; number <= 9; number++){
board[row][col] = number;
if (check_row(row, number)
&& check_col(col, number)
&& check_box(row, col, number)){
int next_row = row;
int next_col = col+1;
if (next_col > 8){
next_col = 0;
next_row++;
}
if (next_row > 8){
return true;
}
if (solve(next_row, next_col))
return true;
}
}
board[row][col] = 0;
return false;
}
board是一个2D int数组。我知道我可以使用某种结构而不是整数,如果数字本来就存在,它会存储,但是这个解决方案对我来说并不是很吸引人。还有其他办法吗?
答案 0 :(得分:2)
在开头的检查中,设置单元格时,
if (board[row][col] != 0){
int next_col = col;
int next_row = row;
next_col++;
if (next_col > 8){
next_row++;
next_col = 0;
}
if (next_row > 8){
return true;
} else {
if (solve(next_row, next_col))
return true;
}
}
添加
else {
return false;
}
或将最后一个更改为
return solve(next_row, next_col);
避免更改给定的数字。如果拼图无法解决 - 即使在错误地猜测前一个单元格可以解决原始单元之后 - 它仍然很乐意继续更改单元格中的数字。
答案 1 :(得分:0)
您可以创建一组所有访问过的位置。
示例实现是创建包含已访问过的每个位置的std::set<pair<int, int> > visited
。然后,如果访问过该位置,请不要更改该值。