1091. 二进制矩阵中的最短路径(BFS)
题目
给你一个 n x n 的二进制矩阵 grid 中,返回矩阵中最短 畅通路径 的长度。如果不存在这样的路径,返回 -1 。
二进制矩阵中的 畅通路径 是一条从 左上角 单元格(即,(0, 0))到 右下角 单元格(即,(n - 1, n - 1))的路径,该路径同时满足下述要求:
路径途经的所有单元格都的值都是 0 。
路径中所有相邻的单元格应当在 8 个方向之一 上连通(即,相邻两单元之间彼此不同且共享一条边或者一个角)。
畅通路径的长度 是该路径途经的单元格总数。
示例1
输入:grid = [[0,1],[1,0]]
输出:2
示例2
输入:grid = [[0,0,0],[1,1,0],[1,1,0]]
输出:4
示例3
输入:grid = [[1,0,0],[1,1,0],[1,1,0]]
输出:-1
提示
n == grid.length
n == grid[i].length
1 <= n <= 100
grid[i][j]
为0
或1
分析
经典的bfs代码。从起点开始,将周围八个点依次扫描依次,若存在0,则加入路径并将该点置为1。因为每回都走一步,所以不必担心有一条路径先经过一点而将另一条路径堵住,因为那条路径已经被放弃了。先到达终点的必为最短路径,直接返回结果即可,否则不能到达,返回-1。
代码
public int shortestPathBinaryMatrix(int[][] grid) {
if(grid[0][0]==1 || grid[grid.length-1][grid[0].length-1]==1) return -1;
if(grid.length==1) return 1;
int count = grid.length * grid.length;
List<List<Integer>> paths = new ArrayList<>();
paths.add(new ArrayList<>(Arrays.asList(0, 0, 1)));
grid[0][0]=1;
int[][] steps = new int[][]{{-1, -1},{-1, 0},{-1, 1},{0, -1},{0, 1},{1,-1},{1,0},{1,1}};
while(paths.size()>0){
int i = paths.get(0).get(0);
int j = paths.get(0).get(1);
int cur = paths.get(0).get(2);
paths.remove(0);
for(int[] step:steps){
if(i+step[0]>=0 && i+step[0]<grid.length && j+step[1]>=0 && j+step[1]<grid[0].length){
if(grid[i+step[0]][j+step[1]]==0){
paths.add(new ArrayList<>(Arrays.asList(i+step[0], j+step[1], cur+1)));
grid[i+step[0]][j+step[1]] = 1;
if(i+step[0]==grid.length-1 && j+step[1]==grid[0].length-1) count = Math.min(count, cur+1);
}
}
}
}
return count==grid.length*grid.length ? -1 : count;
}
结果
时间超过16%
内存超过85%