我正在用Java构建一个数独求解器,我正在使用回溯算法。有一个堆栈溢出错误,我怀疑在我的代码中的某处有无限递归。我知道我提供的信息很少,但我很困难,不知道如何先行。
public void run(int r, int c){
if(!grid[r][c].isOriginal()){
checkAll(r, c);
}
if(moveOn){
if(c < 8){
c++;
} else if (r < 8){
c = 0;
r++;
}
} else {
if(c > 0){
c--;
} else if(r > 0){
c = 8;
r--;
}
}
if(!finished()) {
run(r, c);
}
}
public void checkAll(int r, int c){
if(grid[r][c].getVal() < 9) {
grid[r][c].setVal(grid[r][c].getVal() + 1);
if(checkSquare(r, c) && checkRow(r, c) && checkCol(r, c)){
moveOn = true;
} else {
checkAll(r, c);
}
} else {
moveOn = false;
grid[r][c].setVal(0);
}
}
}
函数“checkRow”,“checkCol”和“checkSquare”似乎都有效,“finished”和“printGrid”也是如此。
我打电话来启动程序
run(0, 0);
在主要的,程序从左到右解决数独,然后从上到下。
网格是一个代表每个数独方块的9乘9数组,它包含一个名为“Value”的自定义类型,它只包含一个整数和一个布尔值,“isOriginal”表示该值是给定的还是可更改的。
“moveOn”是一个全局变量,其值在“checkAll”中设置,并决定是否继续前进到下一个数独广场或回溯。
一个可能在将来帮助您的提示,尽量避免全局变量。您使用“moveOn”变量作为全局变量的事实更难以调试且更难以预测。使“checkAll”函数返回布尔值而不是此全局变量。
现在针对您的问题,我认为在您对checkAll的递归调用中,您应该更改某个变量中的某些内容,对吧?否则它在输入中将始终具有相同的参数。