我正在使用数独求解器并且solve-method给出了一个错误,我暂时用“try and catch”异常“解决”了这个错误。
但是,我有点担心我会抓住ArrayIndexOutOfBoundsException
。我只想修复错误而不是将其隐藏在try / catch异常中。
这就是try / catch的样子:
try {
if (puzzle.getNum(i, j) != puzzle.blank)
return solve(nexti, nextj);
} catch (ArrayIndexOutOfBoundsException e) {
return true;
}
我在想,因为我已经在x > 8
时获得了信息,现在是时候更改行了,这会导致y++
。当y > 8
时,应该完成程序,因为所有81(9x9)个单元格都已填满。
我正在考虑改变一个简单的
的try / catch方法if((i > 8) && (j > 8)){
return true;
}
但这也给了我一堆错误。
我确信修复非常简单但在概念上很重要。
答案 0 :(得分:1)
我会在方法的开头添加此检查:
if( i >= puzzle.puzzleSize || j >= puzzle.puzzleSize )
{
return false;
}
如果你在任何一个方向上超出了拼图板的范围,你显然没有找到解决方案,因此你返回false。你的nexti和nextj的计算可以在这个检查之后,因为下一个递归调用将处理它们超出界限时的情况。
你可能会想说“好吧,我的下一次计算使用模数,所以它永远不会超出范围。”这是真的,但你也不能保证使用正确的参数调用方法,所以值得检查。
答案 1 :(得分:0)
由于您使用的是递归方法,因此您应该将第一行代码作为“结束条件”。
添加
if((i > 8) && (j > 8)){
return true;
}
在你的方法开始时应该做的伎俩(如果你确定在j <8时你永远不会发送i = 9)。这样做的其他错误是什么?