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; } };
01BFS本质上是dijkstra算法,其中的deque就是dijkstra算法中的最小堆,可以用同样的风格编码。(当然也可以不用dijkstra这种更新距离的风格,而是使用bfs确定最短路的风格)
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 震惊!C++程序真的从main开始吗?99%的程序员都答错了
· winform 绘制太阳,地球,月球 运作规律
· 【硬核科普】Trae如何「偷看」你的代码?零基础破解AI编程运行原理
· 上周热点回顾(3.3-3.9)
· 超详细:普通电脑也行Windows部署deepseek R1训练数据并当服务器共享给他人