1091. 二进制矩阵中的最短路径
1.题目描述
在一个 N × N 的方形网格中,每个单元格有两种状态:空(0)或者阻塞(1)。
一条从左上角到右下角、长度为 k 的畅通路径,由满足下述条件的单元格 C_1, C_2, …, C_k 组成:
相邻单元格 C_i 和 C_{i+1} 在八个方向之一上连通(此时,C_i 和 C_{i+1} 不同且共享边或角)C_1 位于 (0, 0)(即,值为 grid[0][0])C_k 位于 (N-1, N-1)(即,值为 grid[N-1][N-1])如果 C_i 位于 (r, c),则 grid[r][c] 为空(即,grid[r][c] == 0)
返回这条从左上角到右下角的最短畅通路径的长度。如果不存在这样的路径,返回 -1 。
示例 1:
示例 2:
提示:
(1)1 <= grid.length == grid[0].length <= 100
(2)grid[i][j] 为 0 或 1
2.思路
利用BFS进行遍历,每遍历一层路径的长度加1,矩阵中0表示可以通过,1表示无法通过。
3.代码
class Solution {
public:
int shortestPathBinaryMatrix(vector<vector<int>>& grid) {
if(grid.empty()){
return -1;
}
int row = grid.size();
int col = grid[0].size();
if(grid[0][0] == 1 || grid[row-1][col-1] == 1){
return -1;
}
vector<vector<int>> dir{{-1, 0}, {0, 1}, {1, 0}, {0, -1}, {-1, -1}, {-1, 1}, {1, -1}, {1, 1}};
queue<pair<int,int>> q;
q.push(make_pair(0,0));
int pathLen = 0;
while(!q.empty()){
int sz = q.size();
pathLen++;//路径长度+1
for(int i = 0;i < sz;++i){
auto node = q.front();
int r = node.first,c = node.second;
q.pop();
if(r == row - 1 && c == col - 1){
return pathLen;
}
grid[r][c] = 1;//把当前节点标记为1,防止重复遍历
for(int i = 0;i < 8;++i){//广度优先遍历
int nr = r + dir[i][0];
int nc = c + dir[i][1];
if(nr < 0 || nr >= row || nc < 0 || nc >= col || grid[nr][nc] == 1){//碰到边界就换一个方向
continue;
}
q.push(make_pair(nr,nc));//把坐标存入队列中
grid[nr][nc] = 1;//把当前节点标记为1,防止重复遍历
}
}
}
return -1;
}
};
4.复杂度分析
时间复杂度:O(m*n)
空间复杂度:O(1),每层最多8个节点