01BFS/LCP 56. 信物传送

在进行普通的BFS时,会将新的节点加入队尾。

但是由于01BFS的路径长度可能为0,故使用双端队列记录节点。如果路径为0,则加入队头,否则加入队尾。

例题:LCP 56. 信物传送

leetcode 2290. 到达角落需要移除障碍物的最小数目

复制代码
class Solution {
public:
    int minimumObstacles(vector<vector<int>>& grid) {
        int m=grid.size();
        int n=grid[0].size();
        vector<vector<int>> vis=grid;
        deque<pair<pair<int,int>,int>> x_y_step;
        x_y_step.push_back({{0,0},0});
        //vis[0][0]=2;
        while(x_y_step.size())
        {
            auto cur=x_y_step.front();
            auto x=cur.first.first;
            auto y=cur.first.second;
            auto step=cur.second;
            x_y_step.pop_front();
            if(x==m-1&&y==n-1)
                return step;
            vis[x][y]=2;
            //cout<<x<<y<<endl;
            if(x-1>=0)
            {
                if(vis[x-1][y]!=2)
                {
                    vis[x-1][y]=2;
                    if(grid[x-1][y]==1)
                        x_y_step.push_back({{x-1,y},step+1});
                    else
                        x_y_step.push_front({{x-1,y},step});
                }

            }
            if(y-1>=0)
            {
                if(vis[x][y-1]!=2)
                {
                    vis[x][y-1]=2;
                    if(grid[x][y-1]==1)
                        x_y_step.push_back({{x,y-1},step+1});
                    else
                        x_y_step.push_front({{x,y-1},step});
                }

            }

            if(x+1<m)
            {
                if(vis[x+1][y]!=2)
                {
                    vis[x+1][y]=2;
                    if(grid[x+1][y]==1)
                        x_y_step.push_back({{x+1,y},step+1});
                    else
                        x_y_step.push_front({{x+1,y},step});
                }

            }
            if(y+1<n)
            {
                if(vis[x][y+1]!=2)
                {
                    vis[x][y+1]=2;
                    if(grid[x][y+1]==1)
                        x_y_step.push_back({{x,y+1},step+1});
                    else
                        x_y_step.push_front({{x,y+1},step});
                }

            }

        }
        return -1;
    }
};
View Code
复制代码

 

 

01BFS本质上是dijkstra算法,其中的deque就是dijkstra算法中的最小堆,可以用同样的风格编码。(当然也可以不用dijkstra这种更新距离的风格,而是使用bfs确定最短路的风格)

posted @   80k  阅读(37)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 震惊!C++程序真的从main开始吗?99%的程序员都答错了
· winform 绘制太阳,地球,月球 运作规律
· 【硬核科普】Trae如何「偷看」你的代码?零基础破解AI编程运行原理
· 上周热点回顾(3.3-3.9)
· 超详细:普通电脑也行Windows部署deepseek R1训练数据并当服务器共享给他人
点击右上角即可分享
微信分享提示