c++版 leetcode 1091

一、BFS(广度优先排序)

Time:O(n²)84ms
同DFS时间复杂度一样:
存储方式:1、二维数组表。time:O(n²)
2、邻接表。time:O(n+e)

豪华解析版
class Solution {
public:
    // 列出八个方向上移动的方法 direction
    vector<vector<int>> method={{-1,0},{-1,1},{0,1},{1,1},{1,0},{1,-1},{0,-1},{-1,-1}};
    // 最小路径二进制矩阵
    int shortestPathBinaryMatrix(vector<vector<int>>& grid) {
        //判断首位置是否为1,若是则退出
        if(grid[0][0]==1)return -1;
        // 记录该矩阵的行数
        int n=grid.size();
        // 记录步数,至少有第一步
        int step=1;
        // 创建队列存储要进行走路的位置
        queue<pair<int,int>>q;
        // 让队列指向初始位置
        q.push(make_pair(0,0));
        // 将走过的位置标记为2
        grid[0][0]=2;
        // 月读,直到队列为空,即没有下一个位置能走
        while(!q.empty()){
            // 记录队列中的备选位置个数
            int num=q.size();
            // 在备选位置中寻找下一个能走的位置
            for(int i=0;i<num;i++){
                // 记录当前x位置
                int x=q.front().first;
                // 记录当前y位置
                int y=q.front().second;
                // 提取完该位置后,已经没有利用价值了,就从队列中删除,让之后的位置行进
                q.pop();
                // 若提取的元素表格的左下角,返回步数
                if(x==n-1 && y==n-1)return step;
                // 枚举八个方位,看看哪些方法能走得通
                for(int j=0;j<8;j++){
                    // x的下一个位置
                    int xn=x+method[j][0];
                    // y的下一个位置
                    int yn=y+method[j][1];
                    // 判断该位置是否走得通
                    // xn、yn小于0,大等于边界,且该位置存在(不为空)
                    if(xn<0 || yn<0 || xn>=n || yn>=n || grid[xn][yn])continue;
                    // 将该位置标为已走
                    grid[xn][yn]=2;
                    // 并将此位置作为备选
                    q.push(make_pair(xn,yn));
                }
            }
            // 当给层的位置全都进行后,代表着走了一步(宽度优先搜索BFS:breadth first search)
            step++;
        }
        // 无路可走
        return -1;
    }
};
  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值