java - java延迟递归回溯

标签 java delay backtracking

我发现这个数独解算器在尝试解决难题时使用回溯,为了更好地理解,我想延迟该过程,以便我可以分析回溯。但我真的不知道该怎么做。我尝试使用 Thread.sleep(100); ,但我真的不知道到底在哪里放置延迟。

abstract class SudoKiller {
    private SudokuBoard sb;    // Puzzle to solve;

    public SudoKiller(SudokuBoard sb) {
        this.sb = sb;
    }


    private boolean check(int num, int row, int col) {
        int r = (row / sb.box_size) * sb.box_size;
        int c = (col / sb.box_size) * sb.box_size;

        for (int i = 0; i < sb.size; i++) {
            if (sb.getCell(row, i) == num ||
                    sb.getCell(i, col) == num ||
                    sb.getCell(r + (i % sb.box_size), c + (i / sb.box_size)) == num) {
                return false;
            }
        }
        return true;
    }


    public boolean guess(int row, int col) {
        int nextCol = (col + 1) % sb.size;
        int nextRow = (nextCol == 0) ? row + 1 : row;

        try {
            if (sb.getCell(row, col) != sb.EMPTY)
                return guess(nextRow, nextCol);
        }
        catch (ArrayIndexOutOfBoundsException e) {
            return true;
        }

        for (int i = 1; i <= sb.size; i++) {
            if (check(i, row, col)) {
                sb.setCell(i, row, col);
                if (guess(nextRow, nextCol)) {
                    return true;
                }
            }
        }
        sb.setCell(sb.EMPTY, row, col);
        return false;
    }
}

整个项目可以在the authors site上找到.

最佳答案

这里怎么样:

sb.setCell(i, row, col);
Thread.sleep(100);
if (guess(nextRow, nextCol)) {

注意sleep有异常需要处理(即使不抛出),所以最简单的解决方案:

sb.setCell(i, row, col);
try { Thread.sleep(100); } catch(InterruptedException e) {}
if (guess(nextRow, nextCol)) {

即:

  • 设置之后
  • 在递归调用之前

上述任何一个或两个通常都是不错的候选者(取决于具体情况)。

您甚至可以将其放在setCell方法中。

关于java - java延迟递归回溯,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14923701/

相关文章:

c++ - 在迷宫 C++ 中查找路径是否存在

ocaml - 有哪些 OCaml 库用于惰性列表处理?

java - Maven 阴影插件未执行

Java-获取数字周围的所有值

jQuery 延迟函数

java - 如何在继续方法之前暂停

python - 如何在不影响其余部分的情况下延迟程序的一部分?

java - 如何使用可用 RAM 在 Java 中有效地缓存对象?

java - 带有 $in 运算符的 mongodb find() 是顺序的还是并行的?

java - 使用堆栈和回溯的 N 皇后程序