1

在 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;
}
}
4

1 回答 1

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长时间。

于 2015-06-11T11:22:12.700 回答