1.题目




2.思路
List<int[]> qu=List of(new int[]{beginX,beginY});
//创建一个 List<int[]>,并把一个二维坐标 (beginX, beginY)(用 int[] 表示)放进去作为列表的第一个元素。
(1)每次从当前位置 (x,y) 走到相邻四格。
int[][] directions={{-1,0},{1,0},{0,-1},{0,1}};
(2)初始化:行列、访问数组、入口坐标
vis 用于防止重复入队导致死循环/超时。
入口先标记已访问。
(3)按层 BFS:从入口开始,每次扩展一圈,ans 记录当前圈的步数;第一次走到边界的可走格就是最近出口,直接返回 ans;没有就返回 -1。
3.代码实现
java
class Solution {
static int[][] directions={{-1,0},{1,0},{0,-1},{0,1}};
public int nearestExit(char[][] maze, int[] entrance) {
//行数
int m=maze.length;
//列数
int n=maze[0].length;
//标记访问过的元素
boolean[][] vis=new boolean[m][n];
//起点
int beginX=entrance[0];
int beginY=entrance[1];
//访问标记
vis[beginX][beginY]=true;
//创建一个 List<int[]>,并把一个二维坐标 (beginX, beginY)(用 int[] 表示)放进去作为列表的第一个元素。
List<int[]> qu=List.of(new int[]{beginX,beginY});
for(int ans=1;!qu.isEmpty();ans++)
{
List<int[]> tmp=qu;
qu=new ArrayList<>();
for(int[] p:tmp)
{//注意起点不算终点,不能在这里判断p是不是终点
for(int[] d:directions)
{//起点不算终点,不能判断p是不是终点
int x=p[0]+d[0];
int y=p[1]+d[1];
//之前没有访问过的元素
if(0<=x&&x<m&&0<=y&&y<n&&maze[x][y]=='.'&&vis[x][y]==false)
{
if(x==0||y==0||x==m-1||y==n-1)
{
//到达边界,也就是到达终点
return ans;
}
//访问过的元素进行标记
vis[x][y]=true;
qu.add(new int[]{x,y});
}
}
}
}
return -1;//无法到达终点
}
}