【问题标题】:Detect Infinite Loop?检测无限循环?
【发布时间】: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


【解决方案1】:

这只是一个想法(我会发表评论,但这个帐户太新了)。试着让它,如果从 0-9 的所有数字都返回 false,那么它会返回某种错误。例如,如果它在 9 之前没有找到答案,则向上移动到 10。如果程序检测到 10,则执行某种 System.out.println("Unsolvable") 或类似的操作。对不起,如果我顺便让你感到困惑。有人告诉我我不善于解释。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2015-12-11
    • 2014-04-08
    • 1970-01-01
    • 1970-01-01
    • 2019-10-11
    • 1970-01-01
    • 2011-01-19
    相关资源
    最近更新 更多