检测无限循环?

时间:2014-03-09 15:38:07

标签: java loops recursion infinite

我正在开发一个数独求解器程序。这个想法是用户输入数独谜题,程序为他们解决了这个问题。

进入任何正常拼图时程序运行正常。但是,有些难题无法解决。以下是我输入的一个示例:http://i.imgur.com/5L8pF8Q.png

输入完全合法,但由于所有数字1-9都已在该行和列中使用,因此无法填写右上方。 如果我点击“Solve”,我的程序会在进入无限循环时冻结。

所以我的问题是,如何防止这种情况发生?

我尝试实施“布尔标志”方法,但第二个想法我意识到它可能不可行。

这是我的解算器方法:

public boolean solve(int i, int j) {
    for (int a = 0; a < 9; a++) {
        for (int b = 0; b < 9; b++) {
            if (sudokuArray[a][b] == 0) {
                for (int k = 1; k <= 9; k++) {
                    sudokuArray[a][b] = k;
                    if (checkNumber(a, b, k) && solve(a, b)) {
                        return true;
                    }else {
                        sudokuArray[a][b] = 0;
                    }
                }
                return false;
            }
        }
    }
    return true;
}

checkNumber()方法检查数字k是否可合法地插入行a,列b并相应地返回true / false。

想法?提示?

感谢。

PS:根据要求添加了checkNumber()

public boolean checkNumber(int i, int j, int num) {
    for (int a = 0; a < 9; a++) {
        if (a != i) {
            if (sudokuArray[a][j] == num) {
                return false;
            }
        }
        if (a != j) {
            if (sudokuArray[i][a] == num) {
                return false;
            }
        }
    }
    for (int a = (i / 3) * 3; a < (i / 3) * 3 + 3; a++) {
        for (int b = (j / 3) * 3; b < (j / 3) * 3 + 3; b++) {
            if ((a != i) && (b != j)) {
                if (sudokuArray[a][b] == num) {
                    return false;
                }
            }
        }
    }
    return true;
}

1 个答案:

答案 0 :(得分:2)

这只是一个想法(我会评论,但这个帐户太新了)。尝试制作它,以便如果0-9中的所有数字都返回false,则返回某种错误。例如,如果它没有找到9的答案,则向上移动到10.如果程序检测到10,则执行某种类型的System.out.println(“无法解决的”)或类似的行。对不起,如果我顺便让你困惑的话。我被告知我不善于解释事情。