class Solution {
public int nearestExit(char[][] maze, int[] entrance) {
// 初始化可走的四个方向
List<int[]> step = new ArrayList<>();
step.add(new int[]{0, 1});
step.add(new int[]{0, -1});
step.add(new int[]{1, 0});
step.add(new int[]{-1, 0});
// 队列存储已经访问的点
Deque<int[]> visited = new ArrayDeque<>();
// 用一个数组表示当前坐标及距离初始位置距离
int[] ent = new int[]{entrance[0], entrance[1], 0};
// 将初始位置加入已访问队列,并设为墙
visited.add(ent);
maze[entrance[0]][entrance[1]] = '+';
// 获取地图的长宽
int X = maze.length;
int Y = maze[0].length;
// 队列不为空时
while (!visited.isEmpty()) {
// 取出队首坐标
int[] pos = visited.pop();
// 遍历可走的四个方向
for (int i = 0; i < 4; i++) {
int nX = pos[0] + step.get(i)[0];
int nY = pos[1] + step.get(i)[1];
int steps = pos[2] + 1;
// 如果坐标合法并且不是墙
if (nX >= 0 && nX < X && nY >= 0 && nY < Y && maze[nX][nY] == '.') {
// 如果是出口,返回距离
if (nX == 0 || nX == X - 1 || nY == 0 || nY == Y - 1) {
return steps;
}
// 不是出口,加入队列,设为墙,继续BFS搜索
visited.add(new int[]{nX, nY, steps});
maze[nX][nY] = '+';
}
}
}
// 找不到出口
return -1;
}
}
【LeetCode】1926.迷宫中离入口最近的出口
最新推荐文章于 2022-04-30 22:04:58 发布