这是一个数独求解器,每个方块都有这个方法。我的想法是,如果此方法的一个实例通过循环而没有找到任何有效值,它将返回到调用它的前一个方法并继续循环 - 尝试从for循环中的下一个值。我希望这足以回溯,但我所有的测试都失败了,我完全无法理解我将如何解决这个问题。 / end noob-lament
public boolean recursive() {
for(int i = 1; i <= boardSize; i++) {
if(!validValue(i)) {
continue;
} else {
setValue(i);
if(getNext() == null) // This signifies that I am at the end of the list
return true;
else
getNext().recursive(); // same method in the next sudoku square
}
}
return false;
}
答案 0 :(得分:2)
这里有两个正确性问题:
true
- 如果是,你应该停止递归 - 你找到了解决方案,不要覆盖它!getNext().recursive();
产生true
- 你应该将此true
冒出来[并且如(1)所述 - 停止递归,你有一个解决方案!] 答案 1 :(得分:1)
好的 - 所以既然我的同伴帮助我解决了这个问题,并设法让我了解遗漏的内容,我想我想在这里分享一下,以防有人有兴趣知道遗失了什么。
循环完成后,该方法需要重置其值。如果不是,那么之前在回溯之前测试的旧值将在回溯之后保留。这意味着当isValid()方法检查给定方块所属的列,行和方框时,isValid()方法会找到之前设置的大量值。
所有需要的是'return false'之前的一行;
//(end of for-loop)
setValue(0);
return false;
//(method ends)
答案 2 :(得分:0)
你要两次调用getNext()。如果它在if语句中没有返回null,则再次调用它。你确定要这么做吗?