0

我正在研究数独求解器,并且求解方法给出了一个错误,我已经通过 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;
}   

但这也给了我一堆错误。

我确信修复非常简单,但在概念上很重要。

4

2 回答 2

1

我会在方法的开头添加这个检查:

if( i >= puzzle.puzzleSize || j >= puzzle.puzzleSize )
{
    return false;
}

如果您在任一方向都超出了拼图板的范围,那么您显然还没有找到解决方案,因此您返回 false。您对 nexti 和 nextj 的计算可以在此检查之后进行,因为下一个递归调用将处理它们超出范围的情况。

您可能会说“好吧,我的 nextj 计算使用模数,所以它永远不会超出范围。” 确实如此,但您也不能保证将使用正确的参数调用该方法,因此值得检查。

于 2013-03-20T15:20:49.050 回答
0

由于您使用的是递归方法,因此您应该将“结束条件”作为第一行代码。

添加

if((i > 8) && (j > 8)){
      return true;
}

在您的方法开始时应该可以解决问题(如果您确定在 j < 8 时从不发送 i=9)。执行此操作时遇到的其他错误是什么?

于 2013-03-20T15:02:39.190 回答