我尝试使用递归和回溯来编码数独求解器。但是我的代码存在一些问题,它总是返回false。我尝试调试,它调用next(int row,int col)方法直到第二行,第六列,然后停止并开始回溯。问题是回溯持续到我的数独游戏中的第一个单元格然后它返回false。它不会取代其他人的细胞数量。
这是我的代码......我错过了什么吗?
/** Calls solve for the next cell */
private boolean next(int row, int col) {
if (col < 8)
return solve(row, col + 1);
else
return solve(row + 1, 0);
}
public boolean solve(int row, int col) {
if (row > 8) {
return true;
}
if (model[row][col] != 0) {
if (isSafe(row, col, model[row][col]))
return next(row, col);
}
for (int value = 1; value < 10; value++) {
if (isSafe(row, col, value)) {
model[row][col] = value;
return next(row, col);
}
}
return false;
}
答案 0 :(得分:1)
return next(row, col);
应该是
if (next(row, col)) {
return true;
}
if = = 0似乎没有用。
全部完成
未经测试但具有正确的反向跟踪:将单元格再次设置为0,因此可以再次填充。
public boolean solve(int row, int col) {
if (row > 8) {
return true;
}
if (model[row][col] != 0) {
// isSafe may be assumed on correct puzzles.
return isSafe(row, col, model[row][col]))
&& next(row, col);
}
for (int value = 1; value < 10; value++) {
if (isSafe(row, col, value)) {
model[row][col] = value;
if (next(row, col)) {
return true;
}
}
}
model[row][col] = 0;
return false;
}
答案 1 :(得分:1)
尝试在返回false之前添加model[row][col] = 0;
;