骑士的旅行回溯持续时间太长

时间:2013-12-26 11:04:27

标签: java time-complexity recursive-backtracking

在8x8电路板上回溯解决骑士旅游问题需要多长时间?因为我的算法已经计算得太长了似乎,就像它不会完成。但是当我尝试使用6x6或5x5电路板时,它会成功完成。

代码:

class KnightsTour{

private boolean[][] board;
private int count, places;
private static final Point[] moves = new Point[]{
    new Point(-2, -1),
    new Point(-2, 1),
    new Point(2, -1),
    new Point(2, 1),
    new Point(-1, -2),
    new Point(-1, 2),
    new Point(1, -2),
    new Point(1, 2)
};

public KnightsTour(int n) {
    board = new boolean[n][n];
    places = n*n;
    count = 0;
     }

public boolean ride(int x, int y) {


    board[x][y] = true;
    count++;

    if (count == places) {
        return true;
    }

    for (Point p : moves) {
        int nextX = x + p.x;
        int nextY = y + p.y;

        if (nextX < 0 || nextX >= board.length || nextY < 0 || nextY >= board.length || board[nextX][nextY]) {
            continue;
        } 
        if (ride(nextX, nextY)) {
            return true;
        }
    }

    board[x][y] = false;
    count--;

    return false;
}
}

1 个答案:

答案 0 :(得分:1)

我遇到了同样的问题。一切顺利运行直到n = 7,突然需要永远计算n=8。我希望这有助于某人:)

问题在于您检查移动的顺序。您正在使用:

xMove[8] = { -2, -2, 2, 2, -1, -1, 1, 1}

yMove[8] = { -1, 1, -1, 1, -2, 2, -2, 2}

如果您在2D平面中绘制这些矢量,则会随意放置它们。换句话说,它们不是以顺时针方向或逆时针方式排序的。请考虑一下:

xMove[8] = { 2, 1, -1, -2, -2, -1, 1, 2 }

yMove[8] = { 1, 2, 2, 1, -1, -2, -2, -1 }

如果绘制这些矢量,它们整齐地排列在逆时针方向的圆圈中。 不知何故,这导致递归对于n的大值运行得非常快。请注意,从n=9开始计算仍然需要永远。