AcWing 844. 走迷宫
原题链接
简单
作者:
不哭死神
,
2024-11-17 10:44:48
,
所有人可见
,
阅读 2
走迷宫-BFS
核心思路:
- 定义好方向数组
- 每次将新节点加入队列后,判断节点范围
- 题目中左上角坐标是(1, 1),因为我是从数组0开始输入,所以左上角是(0, 0)
import java.util.*;
public class Main {
public static class Pair {
int x;
int y;
public Pair(int x, int y) {
this.x = x;
this.y = y;
}
}
private static int[] dx = {1, 0, -1, 0};
private static int[] dy = {0, 1, 0, -1};
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
int n = sc.nextInt();
int m = sc.nextInt();
int[][] grid = new int[n][m];
for (int i = 0; i < n; i++) {
for (int j = 0; j < m; j++) {
grid[i][j] = sc.nextInt();
}
}
int[][] dist = new int[n][m];
Queue<Pair> q = new LinkedList<>();
dist[0][0] = 0; // 表示左上角(0, 0)点到自己的距离是0
q.offer(new Pair(0, 0)); // 将起点加入队列
while (!q.isEmpty()) {
var p = q.poll();
for (int i = 0; i < 4; i++) { // 遍历4个方向
for (int j = 0; j < 4; j++) {
int x = p.x + dx[i];
int y = p.y + dy[i];
if (x >= 0 && x < n && y >= 0 && y < m && grid[x][y] == 0 && dist[x][y] == 0) { // 判断坐标以及新节点的数值范围
q.offer(new Pair(x, y));
dist[x][y] = dist[p.x][p.y] + 1; // 更新新节点的距离
}
}
}
}
System.out.println(dist[n - 1][m - 1]);
sc.close();
}
}