1

パズルを解こうとしているときにバックトラッキングを使用するこの数独ソルバーを見つけました。理解を深めるために、バックトラックを分析できるようにプロセスを遅らせたいと思います。しかし、私はそれを行う方法を本当に知りません。使ってみまし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;
    }
}

プロジェクト全体は、作者のサイトにあります。

4

1 に答える 1

0

ここではどうですか:

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

于 2013-02-17T17:14:42.907 に答える