我正在开发一个数独求解器程序。这个想法是用户输入数独谜题,程序为他们解决了这个问题。
进入任何正常拼图时程序运行正常。但是,有些难题无法解决。以下是我输入的一个示例: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;
}
答案 0 :(得分:2)
这只是一个想法(我会评论,但这个帐户太新了)。尝试制作它,以便如果0-9中的所有数字都返回false,则返回某种错误。例如,如果它没有找到9的答案,则向上移动到10.如果程序检测到10,则执行某种类型的System.out.println(“无法解决的”)或类似的行。对不起,如果我顺便让你困惑的话。我被告知我不善于解释事情。