1091. 二进制矩阵中的最短路径

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个节点

发布了196 篇原创文章 · 获赞 0 · 访问量 5416

猜你喜欢

转载自blog.csdn.net/jiangdongxiaobawang/article/details/104553279