二进制矩阵中的最短路径
力扣链接:1091. 二进制矩阵中的最短路径
题目描述
给你一个 n x n 的二进制矩阵 grid 中,返回矩阵中最短 畅通路径 的长度。如果不存在这样的路径,返回 -1 。
二进制矩阵中的 畅通路径 是一条从 左上角 单元格(即,(0, 0))到 右下角 单元格(即,(n - 1, n - 1))的路径,该路径同时满足下述要求:
路径途经的所有单元格都的值都是 0 。
路径中所有相邻的单元格应当在 8 个方向之一 上连通(即,相邻两单元之间彼此不同且共享一条边或者一个角)。
畅通路径的长度 是该路径途经的单元格总数。
示例
Java代码
class Solution {
public int shortestPathBinaryMatrix(int[][] grid) {
int m = grid.length;
int n = grid[0].length;
if (grid == null || m == 0 || n == 0) return -1;
if(grid[0][0] == 1 || grid[m - 1][n - 1] == 1) return -1;
//定义8个方向
int[][] dir = {{1,-1}, {1, 0}, {1, 1}, {0,-1},{0,1},{-1,-1},{-1,0},{-1,1}};
//BFS
Queue<int[]> queue = new LinkedList<>();
queue.add(new int[]{0, 0}); //把起点扔进去
grid[0][0] = 1; //将起点标记为阻塞
int path = 1; //层数
while(!queue.isEmpty()) {
int size = queue.size();
while(size-- > 0) {
int[] cur = queue.poll();
int x = cur[0];
int y = cur[1];
//能放进队列里的都是0可以走的点
//如果等于终点则返回
if(x == m - 1 && y == n - 1) return path;
//开始八个方向的判断
for(int[] d : dir) {
int x1 = x + d[0];
int y1 = y + d[1];
if(x1 < 0 || x1 >= m || y1 < 0 || y1 >= m || grid[x1][y1] == 1) {
continue;
}
//把数组范围内并且为0不阻塞的放入队列中
queue.add(new int[]{x1, y1});
grid[x1][y1] = 1;
}
}
path++;
}
return -1;
}
}
来源:力扣(LeetCode)
链接:https://leetcode.cn/problems/shortest-path-in-binary-matrix
著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。