Sudoku Solver无限递归Java

时间:2018-09-17 14:00:12

标签: java recursion stack-overflow sudoku

我正在用Java构建数独求解器,并且正在使用回溯算法。有一个堆栈溢出错误,我怀疑代码中的某处存在无限递归。我知道我提供的信息很少,但是我是如此困窘,不知道该怎么做。

    public void run(int r, int c){
        if(!grid[r][c].isOriginal()){
            checkAll(r, c);
        }

        if(moveOn){
            if(c < 8){
                c++;
            } else if (r < 8){
                c = 0;
                r++;
            }
        } else {
            if(c > 0){
                c--;
            } else if(r > 0){
                c = 8;
                r--;
            }
        }

        if(!finished()) {
            run(r, c);
        }
    }

    public void checkAll(int r, int c){
        if(grid[r][c].getVal() < 9) {
            grid[r][c].setVal(grid[r][c].getVal() + 1);
            if(checkSquare(r, c) && checkRow(r, c) && checkCol(r, c)){
                moveOn = true;
            } else {
                checkAll(r, c);
            }
        } else {
            moveOn = false;
            grid[r][c].setVal(0);
        }
    }
}

函数“ checkRow”,“ checkCol”和“ checkSquare”似乎都可以工作,“ finished”和“ printGrid”也可以工作。

我通过调用

启动程序
run(0, 0);

在主程序中,程序从左到右,然后从上到下解决数独。

网格是一个9 x 9的数组,代表每个数独正方形,拥有一个名为“ Value”的自定义类型,该类型仅包含一个整数和一个布尔值“ isOriginal”,指示该值是给定值还是可变值。

“ moveOn”是一个全局变量,其值在“ checkAll”中设置,并决定是继续到下一个数独方块还是回溯。

1 个答案:

答案 0 :(得分:0)

一个可能在将来对您有所帮助的技巧,请尝试避免使用全局变量。在全局变量中使用“ moveOn”变量这一事实很难调试,也难以预测。 使您的“ checkAll”函数返回一个布尔值而不是此全局变量。

现在考虑您的问题,我认为在递归调用checkAll时,您应该更改变量之一,对吗?否则,它将在输入中始终具有相同的参数。