【发布时间】:2014-04-12 14:46:36
【问题描述】:
我正在开发一个数独求解程序。这个想法是用户输入数独谜题,程序会为他们解决。
程序在输入任何普通谜题时都能正常工作。但是,有些谜题是无法解决的。这是我输入的一个示例:http://i.imgur.com/5L8pF8Q.png
输入是完全合法的,但右上角的方块不能填写,因为所有数字 1-9 已在该行和列中使用。 如果我点击“求解”,我的程序会在进入无限循环时冻结。
所以我的问题是,我怎样才能防止这种情况发生?
我尝试实施“布尔标志”方法,但转念一想,我意识到这可能不可行。
这是我的求解器方法:
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;
}
【问题讨论】:
-
真的无限吗?在取得一些进展的同时,不只是花费了太长时间吗?毕竟这是一个相当大的搜索树。
-
是的,它是无限的。看一下屏幕截图 - 你会发现在右上角输入合法号码是不可能的。
-
请分享方法代码
checkNumber()。这种方法需要更多时间吗? -
好吧,虽然问题不存在...
-
Chris 无法检测到无限循环en.wikipedia.org/wiki/Halting_problem 尝试另一种方法。
标签: java loops recursion infinite