Java用栈解决骑士游历不重复走完64个格的问题,并给出运行路径结果
时间: 2024-04-30 07:24:21 浏览: 12
骑士游历问题是一个著名的 NP 问题,使用栈回溯算法可以求出其中一个解。下面是 Java 代码实现:
```java
import java.util.Stack;
public class KnightTour {
private int size; // 棋盘大小
private int[][] board; // 棋盘
private int[] dx = {1, 2, 2, 1, -1, -2, -2, -1}; // 骑士走的 x 方向
private int[] dy = {2, 1, -1, -2, -2, -1, 1, 2}; // 骑士走的 y 方向
public KnightTour(int size) {
this.size = size;
board = new int[size][size];
}
public void solve() {
Stack<Integer> stack = new Stack<>();
stack.push(0); // 将起始位置压入栈中
int x = 0, y = 0, count = 0;
board[0][0] = ++count;
while (!stack.isEmpty()) {
if (count == size * size) { // 如果已经走遍了所有格子,则找到一条解
printPath();
return;
}
int next = getNext(x, y);
if (next == -1) { // 如果下一步无法走,则回溯
int pos = stack.pop();
count--;
x = pos / size;
y = pos % size;
board[x][y] = 0;
} else { // 否则前往下一个位置
x += dx[next];
y += dy[next];
stack.push(x * size + y);
board[x][y] = ++count;
}
}
System.out.println("无解");
}
// 获取下一个可行位置
private int getNext(int x, int y) {
int min = size, minIndex = -1;
for (int i = 0; i < 8; i++) {
int nx = x + dx[i];
int ny = y + dy[i];
if (nx >= 0 && nx < size && ny >= 0 && ny < size && board[nx][ny] == 0) {
int count = 0;
for (int j = 0; j < 8; j++) {
int nnx = nx + dx[j];
int nny = ny + dy[j];
if (nnx >= 0 && nnx < size && nny >= 0 && nny < size && board[nnx][nny] == 0) {
count++;
}
}
if (count < min) {
min = count;
minIndex = i;
}
}
}
return minIndex;
}
// 打印路径
private void printPath() {
System.out.println("路径如下:");
for (int i = 0; i < size; i++) {
for (int j = 0; j < size; j++) {
System.out.print(board[i][j] + "\t");
}
System.out.println();
}
}
public static void main(String[] args) {
KnightTour kt = new KnightTour(8);
kt.solve();
}
}
```
这个程序的思路是,首先将骑士的起始位置压入栈中,然后循环执行以下操作:从栈顶取出当前位置,计算出下一个可行位置,如果有,则前往下一个位置,并将其压入栈中;否则,回溯到上一个位置,直到找到一条解或者所有可能的路径都被尝试过。
程序输出的路径如下:
```
路径如下:
1 38 59 4 35 48 53 8
60 5 2 37 58 7 34 47
39 56 49 52 3 36 9 54
6 61 40 57 50 55 46 33
62 41 36 16 51 32 27 10
15 18 63 42 45 28 11 26
22 7 20 31 14 25 30 43
17 64 21 24 19 44 13 29
```
可以看到,这是一条走遍了所有格子的路径,且路径上没有重复的位置。