延迟递归回溯java
我发现这个数独求解器,当它试图解决难题和更好的理解时使用回溯,我想延迟这个过程,所以我可以分析回溯。但我真的不知道该怎么做。我试图使用Thread.sleep(100);
,但我不知道在哪里放置延迟。延迟递归回溯java
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)) {
即:
- 经过
set
和 - 递归调用之前
上面的任一个或两个通常都是很好的候选者(取决于具体情况)。
你甚至可以把它里面setCell
方法。
我补充说,抛出但Im获取此错误:异常在线程“AWT-EventQueue-0”java.lang.Error:未解决的编译问题: 未处理的异常类型InterruptedException – 2013-02-17 17:18:27
@BobSmith请参阅编辑。 – Dukeling 2013-02-17 17:21:02
该程序冻结,然后几秒钟后所有的数字立即弹出。 – 2013-02-17 17:21:08
使用调试器逐步完成。 – 2013-02-17 17:11:43
即时通讯相当肯定他不知道如何调试 – Michael 2013-02-17 17:12:51
寻找[recursive](http://en.wikipedia.org/wiki/Recursion_%28computer_science%29)方法调用 - 你想睡觉之前调用这些。 – 2013-02-17 17:14:11