下面是一个用回溯算法解决数独的方法..或者那是我的意思
private boolean fillGrid(int[][] a){
if(!find(a)) // this method finds if there's unassigned grid
return true;
for(int i = 0; i<a.length ; i++){
for(int j = 0; j < a.length ; j++){
if(a[i][j] == 0){ // if a[i][j] is unassigned, perform things below
for(int num = 1 ; num <=9; num++){
if(noConflict(a, i, j, num ) && noConflictGrid(a, i, j , num))
a[i][j]= num;
if(fillGrid(a)) // recurse
return true;
a[i][j] = 0; // unassigned to try again whenever false;
}
}
}
}
return false;
}
然而,当我运行它时,它给了我stackoverflow。 stackoverflow指向fillGrid(a)带有&reffrse&#39;评论,和(!找(a))。方法find如下:
private boolean find(int[][] a){
for(int[] b: a){
for(int c: b){
if(c == 0)
return true;
}
}
return false;
}
有人请告诉我代码有什么问题吗?
答案 0 :(得分:1)
if(noConflict(a, i, j, num ) && noConflictGrid(a, i, j , num))
a[i][j]= num;
您确定 总是 保证是真的吗?如果不是,则a
的状态在下一次调用fillGrid(a)
之前不会发生变化,我们会回到原点1,使用相同的输入调用相同的方法。这导致了stackoverflow。
答案 1 :(得分:0)
您在每一步创建了很多分支。
我建议您在每一步上选择一个单元格,然后尝试使用 9个数字填充它,这样您只会继续使用有效的。
现在你在每一步创建最多9 * 9 * 9个分支,你的递归过于复杂,这就是创建堆栈溢出。
所以在每一步中只需寻找第一个免费单元格(使用较低的i和j索引)并尝试用9个数字填充它。