递归数独让我越界错误 - Java
Sudoku by recursion gives me out of bound error - Java
我正在使用递归在 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;
}
现在,它似乎根本没有改变模型[][]。当我初始化 this class 时,我首先在 model[][] 中各处放置一个 0,然后导入一个包含有效数独值的文件。这部分到目前为止有效。当我现在 运行 它时,好像 fsolve 函数什么也没做。
这是我导入文件后的样子,但是在fsolve函数之后是一样的。
如果j>=this.SIZE
,但是i<this.SIZE
,你仍然调用isEmpty(i,j)
,其中j
大概是越界的。 (我认为你需要在撞到 i
时更改 j
。)
public boolean fsolve(int i, int j){
if (j >= this.SIZE){
i++;
j = 0;
if (i>=this.SIZE){
return true;
}
}
假设您使用的是二维网格,您希望 i 和 j 成为 x 和 y 坐标,这可能会解决您的问题。
如果不是,请提供更多信息。
我正在使用递归在 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;
}
现在,它似乎根本没有改变模型[][]。当我初始化 this class 时,我首先在 model[][] 中各处放置一个 0,然后导入一个包含有效数独值的文件。这部分到目前为止有效。当我现在 运行 它时,好像 fsolve 函数什么也没做。
这是我导入文件后的样子
如果j>=this.SIZE
,但是i<this.SIZE
,你仍然调用isEmpty(i,j)
,其中j
大概是越界的。 (我认为你需要在撞到 i
时更改 j
。)
public boolean fsolve(int i, int j){
if (j >= this.SIZE){
i++;
j = 0;
if (i>=this.SIZE){
return true;
}
}
假设您使用的是二维网格,您希望 i 和 j 成为 x 和 y 坐标,这可能会解决您的问题。 如果不是,请提供更多信息。