我发现这个数独解算器在尝试解决难题时使用回溯,为了更好地理解,我想延迟该过程,以便我可以分析回溯。但我真的不知道该怎么做。我尝试使用 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/