【问题标题】:Sudoku by recursion gives me out of bound error - Java递归数独给了我出界错误-Java
【发布时间】:2015-01-08 20:28:20
【问题描述】:

我正在用 Java 制作一个带有递归的数独求解器。

public boolean fsolve(int i, int j){
  if (j >= this.SIZE){
      i++;
      if (i>=this.SIZE){
          return true;
      }
  }
  if (!this.isEmpty(i,j)){
      return fsolve(i,j+1);
  }
  for (int curval = 1; curval < 10; curval++){
      if ((this.tryValue(curval, i, j)) && (this.fsolve(i, j+1))){
          return true;
      }
  }
  this.clear(i, j);
  return false;
  }

这是我的求解函数。

tryValue 函数在 i,j 位置尝试曲线。

clear 函数将位置 i,j 的值设置为 0。

整个数独被加载到一个名为 model[][] 的 int 中,并且我已经创建了检查行、列和框的函数。它们都按预期工作。

我的求解函数抛出了超出范围的错误,我不知所措。我不确定现在该走哪条路,因为我相信我的功能会起作用。

它是这样说的:

Exception in thread "main" java.lang.ArrayIndexOutOfBoundsException: 9
    at Field.isEmpty(Field.java:99)
    at Field.fsolve(Field.java:161)
    at Field.fsolve(Field.java:165)
    at Field.fsolve(Field.java:165)
    at Field.fsolve(Field.java:162)
    at Field.fsolve(Field.java:165)
    at Field.fsolve(Field.java:165)
    at Field.fsolve(Field.java:162)
    at Field.fsolve(Field.java:162)
    at Field.fsolve(Field.java:165)
    at Field.fsolve(Field.java:165)
    at Sudoku.main(Sudoku.java:6)

我的求解函数从第 152 行开始。

我的 isEmpty 函数如下所示:

  public boolean isEmpty(int i, int j) {
  if (this.model[i][j] == 0){
      return true;
  }
  return false;
}

这是我的 tryValue 函数:

public boolean tryValue(int val, int i, int j) {
if (!checkRow(val, i)) {
  return false;
}
if (!checkCol(val, j)) {
  return false;
}
if (!checkBox(val, i, j)) {
  return false;
}
this.model[i][j] = val;
return true;
}

现在,它似乎根本没有改变 model[][]。当我初始化这个类时,我首先在 model[][] 中的任何地方都放置一个 0,然后导入一个包含有效数独值的文件。这部分工作到目前为止。当我现在运行它时,好像 fsolve 函数什么都不做。

这是我导入文件 后的样子,但在fsolve 函数后是一样的。

【问题讨论】:

  • 使用堆栈跟踪发布您的异常。

标签: java recursion boolean indexoutofboundsexception sudoku


【解决方案1】:

如果j&gt;=this.SIZE,但i&lt;this.SIZE,您仍然调用isEmpty(i,j),其中j 可能超出范围。 (我认为当您遇到i 时,您需要更改j。)

【讨论】:

  • 我绝对必须这样做。但是现在它什么也没给我。
  • “什么都不给我”是否意味着它不会返回?有很多组合可以尝试...
  • 不,它根本不会改变模型[][]。我将编辑 OP 以显示我的 tryValue 函数,2 秒。
  • 如果您的check 方法之一返回falsetryValue 将不会修改model;因为你还没有发布那个代码,我不能说这是否是问题。
  • 所以,显然代码按预期工作。我把它发给了一个朋友,他得到了一个不同但仍然错误的结果。很困惑,我把它发给了第二个朋友,令人惊讶的是它对他有用。我的第一个朋友没有正确保存文件,所以它们是 txt 文件而不是数独文件,对我来说,这是我的 Java 无法正常工作。重新安装后,它按预期工作。
【解决方案2】:
public boolean fsolve(int i, int j){
  if (j >= this.SIZE){
      i++;
      j = 0;
      if (i>=this.SIZE){
          return true;
      }
  }

假设您使用 2d 网格,希望 i 和 j 成为 x 和 y 坐标,这可能会解决您的问题。 如果没有,请提供更多信息。

【讨论】:

  • 是的,我必须这样做。但是现在它什么也没做。
猜你喜欢
  • 2021-11-14
  • 1970-01-01
  • 2013-06-18
  • 1970-01-01
  • 2016-08-16
  • 1970-01-01
  • 2015-01-22
  • 2015-12-08
  • 2015-02-13
相关资源
最近更新 更多