import java.util.*;
public class Main {
public static void main(String[] args) {
Scanner scanner = new Scanner(System.in);
int h = scanner.nextInt();
int w = scanner.nextInt();
int[][] maze = new int[h][w];
for (int i = 0; i < h; i++) {
for (int j = 0; j < w; j++) {
maze[i][j] = scanner.nextInt();
}
}
int[][] dirs = {{1, 0}, {0, 1}, {-1, 0}, {0, -1}}; // 下、右、上、左的顺序
Queue<int[]> queue = new LinkedList<>();
queue.add(new int[] {0, 0});
boolean[][] visited = new boolean[h][w];
visited[0][0] = true;
int[][] prevX = new int[h][w];
int[][] prevY = new int[h][w];
for (int i = 0; i < h; i++) {
Arrays.fill(prevX[i], -1);
Arrays.fill(prevY[i], -1);
}
int[] end = {h - 1, w - 1};
boolean found = false;
while (!queue.isEmpty()) {
int[] current = queue.poll();
int x = current[0];
int y = current[1];
if (x == end[0] && y == end[1]) {
found = true;
break;
}
for (int[] dir : dirs) {
int nx = x + dir[0];
int ny = y + dir[1];
if (nx >= 0 && nx < h && ny >= 0 && ny < w && maze[nx][ny] == 0 &&
!visited[nx][ny]) {
visited[nx][ny] = true;
prevX[nx][ny] = x;
prevY[nx][ny] = y;
queue.add(new int[] {nx, ny});
}
}
}
List<int[]> path = new ArrayList<>();
int[] current = end;
while (current[0] != 0 || current[1] != 0) {
path.add(current);
int px = prevX[current[0]][current[1]];
int py = prevY[current[0]][current[1]];
current = new int[] {px, py};
}
path.add(new int[] {0, 0});
Collections.reverse(path);
for (int[] p : path) {
System.out.println("(" + p[0] + "," + p[1] + ")");
}
}
}
https://www.nowcoder.com/discuss/727521113110073344
思路
1.输入处理:读取迷宫的行数和列数,以及迷宫的布局。
2.BFS 初始化:使用队列进行广度优先搜索,初始化起点,并标记为已访问。
3.前驱数组:记录每个节点的前驱节点,以便回溯路径。
4.遍历方向:按照下、右、上、左的顺序处理每个节点的相邻节点,确保路径搜索的顺序。
5.路径回溯:从终点出发,根据前驱节点数组回溯到起点,并将路径逆序输出。



京公网安备 11010502036488号