在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;
}
}
答案 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
开始计算仍然需要永远。