我的回溯算法出了什么问题? (数独求解器,堆栈溢出)

时间:2014-10-10 07:26:08

标签: java algorithm sudoku

下面是一个用回溯算法解决数独的方法..或者那是我的意思

    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;
}

有人请告诉我代码有什么问题吗?

2 个答案:

答案 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个数字填充它。