Java代码实现用队列解决骑士游历问题,并显示输出路径坐标顺序,实例化
时间: 2024-05-04 12:19:13 浏览: 129
以下是Java代码实现用队列解决骑士游历问题的示例:
```java
import java.util.LinkedList;
import java.util.Queue;
public class KnightTour {
static int N = 8;
// 可行的移动方式
static int[] moveX = {2, 1, -1, -2, -2, -1, 1, 2};
static int[] moveY = {1, 2, 2, 1, -1, -2, -2, -1};
public static void main(String[] args) {
int[][] board = new int[N][N];
int startX = 0, startY = 0;
int endX = 7, endY = 7;
if (solveKnightTour(board, startX, startY, endX, endY)) {
printSolution(board);
} else {
System.out.println("No solution exists");
}
}
/**
* 使用 BFS 解决骑士游历问题
*
* @param board 棋盘
* @param startX 开始坐标的 X 坐标
* @param startY 开始坐标的 Y 坐标
* @param endX 结束坐标的 X 坐标
* @param endY 结束坐标的 Y 坐标
* @return 是否有解
*/
static boolean solveKnightTour(int[][] board, int startX, int startY, int endX, int endY) {
// 初始化棋盘为 -1,表示还未到达过该点
for (int i = 0; i < N; i++) {
for (int j = 0; j < N; j++) {
board[i][j] = -1;
}
}
// 开始坐标已经到达
board[startX][startY] = 0;
// 使用队列保存当前已经到达的坐标
Queue<Point> queue = new LinkedList<>();
queue.add(new Point(startX, startY));
while (!queue.isEmpty()) {
Point current = queue.poll();
// 如果到达了终点,返回 true
if (current.x == endX && current.y == endY) {
return true;
}
// 依次尝试 8 个可行的移动方式
for (int i = 0; i < 8; i++) {
int nextX = current.x + moveX[i];
int nextY = current.y + moveY[i];
// 如果该移动方式的下一个坐标合法,且未到达过,那么将该坐标加入队列
if (isValid(nextX, nextY) && board[nextX][nextY] == -1) {
board[nextX][nextY] = board[current.x][current.y] + 1;
queue.add(new Point(nextX, nextY));
}
}
}
// 没有到达过终点,返回 false
return false;
}
static boolean isValid(int x, int y) {
return x >= 0 && x < N && y >= 0 && y < N;
}
// 打印路径
static void printSolution(int[][] board) {
for (int i = 0; i < N; i++) {
for (int j = 0; j < N; j++) {
System.out.print(board[i][j] + " ");
}
System.out.println();
}
}
static class Point {
int x, y;
public Point(int x, int y) {
this.x = x;
this.y = y;
}
}
}
```
你可以根据需要修改 `N` 的值来调整棋盘大小,修改 `startX`、`startY`、`endX`、`endY` 的值来调整起点和终点的位置。
阅读全文