01BFS顾名思义是用在代价只有0和1的图里面的。
而01BFS其实就是使用一个双端队列将0的代价保存进队首,1的代价保存进对尾。
这样可以保证将代价小的先出队。优化了之前随意入队出队的方式。保证了单调性后也就意味着只要碰到结果坐标出队了就证明答案出现。否则在这种图中只用bfs是不可以直接遍历到就是答案的,毕竟他不符合越远越大的规则。那么如果不用01BFS就得全部跑一遍,其实就不知道什么时候退出了。
模板题:P4554 小明的游戏 - 洛谷 | 计算机科学教育新生态 (luogu.com.cn)
#include <bits/stdc++.h>
using namespace std;
const int maxn = 500+10;
char mp[maxn][maxn];
int sx, sy, ex, ey;
int n, m;
deque<pair<int,int> > q;
map<pair<int, int>, int> ans;
int mv[4][2] = {{1,0},{-1,0},{0,1},{0,-1}};
void bfs()
{
q.clear();
q.push_front({sx,sy});
ans[{sx, sy}] = 0;
while (q.size())
{
// cout<<"进来了"<<endl;
pair<int, int> pr = q.front();
q.pop_front();
int x = pr.first;int y = pr.second;
// cout<<x<<' '<<y<<endl;
if (x==ex&&y==ey) break;
for (int i=0;i<4;i++)
{
int nx = x + mv[i][0];
int ny = y + mv[i][1];
if (nx<1||ny<1||nx>n||ny>m) continue;
if (mp[x][y]==mp[nx][ny]&&ans[{x,y}]<ans[{nx,ny}])
{
ans[make_pair(nx, ny)] = ans[make_pair(x,y)];
q.push_front({nx, ny});
}
if (mp[x][y]!=mp[nx][ny]&&ans[{x,y}]+1<ans[{nx,ny}])
{
ans[make_pair(nx, ny)] = ans[make_pair(x,y)]+1;
q.push_back({nx, ny});
}
}
}
cout<<ans[{ex, ey}]<<endl;
}
int main()
{
while (cin>>n>>m)
{
if (n==0&&m==0) break;
for (int i=1;i<=n;i++)
{
for (int j=1;j<=m;j++)
{
cin>>mp[i][j];
ans[{i ,j}] = 1e9;
}
}
cin>>sx>>sy>>ex>>ey;
sx++;sy++;ex++;ey++;
bfs();
}
return 0;
}