【算法学习】01BFS
前言
其实 01bfs 就是用队列维护的最短路,在权值只有 \(0\) 和 \(1\) 时就可以把权值为 \(0\) 的方案放到队列最前,权值为 \(1\) 的则放到最后,然后进行搜索,保证高效和正确性。
P4554 小明的游戏
模板题。
大部分 bfs 题都可以用最短路做,而最短路中 dijkstra 用堆优化保证权值小的优先操作,而这题权值只有 \(01\) 两种,所以用 01bfs,具体用 deque 操作,增加权值为 \(0\) 时(同色),放到队头,增加的权值为 \(1\) 时(异色),放到队尾,相当于直接 \(O(1)\) 排序好了。
#include <bits/stdc++.h>
using namespace std;
int n,m;
int sx,sy,tx,ty;
char c[505][505];
struct ss{
int x,y,w;
};
deque<ss> q;
bool vis[505][505];
int xx[5]={1,-1,0,0};
int yy[5]={0,0,1,-1};
int dfs01(){
while(!q.empty()){
q.pop_front();
}
q.push_back({sx,sy,0});
while(!q.empty()){
ss u=q.front();
q.pop_front();
int x=u.x;
int y=u.y;
int w=u.w;
vis[x][y]=1;
if(x==tx&&y==ty){
return w;
}
for(int i=0;i<4;i++){
int xa=x+xx[i];
int ya=y+yy[i];
if(xa<0||xa>=n||ya<0||ya>=m){
continue;
}
if(vis[xa][ya]==0){
if(c[xa][ya]==c[x][y]){
q.push_front({xa,ya,w+0});
}
else{
q.push_back({xa,ya,w+1});
}
}
}
}
return 0;
}
int main(){
ios::sync_with_stdio(false);
while(1){
cin>>n>>m;
if(n==0&&m==0){
break;
}
for(int i=0;i<n;i++){
for(int j=0;j<m;j++){
cin>>c[i][j];
}
}
cin>>sx>>sy>>tx>>ty;
cout<<dfs01()<<"\n";
for(int i=0;i<n;i++){
for(int j=0;j<m;j++){
vis[i][j]=0;
}
}
}
return 0;
}