Sudoku Solver无限递归Java

问题描述 投票:0回答:1

我正在用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乘9数组,它包含一个名为“Value”的自定义类型,它只包含一个整数和一个布尔值,“isOriginal”表示该值是给定的还是可更改的。

“moveOn”是一个全局变量,其值在“checkAll”中设置,并决定是否继续前进到下一个数独广场或回溯。

java recursion stack-overflow sudoku
1个回答
0
投票

一个可能在将来帮助您的提示,尽量避免全局变量。您使用“moveOn”变量作为全局变量的事实更难以调试且更难以预测。使“checkAll”函数返回布尔值而不是此全局变量。

现在针对您的问题,我认为在您对checkAll的递归调用中,您应该更改某个变量中的某些内容,对吧?否则它在输入中将始终具有相同的参数。

© www.soinside.com 2019 - 2024. All rights reserved.