【算法学习】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;
}
posted @ 2024-09-17 13:17  sad_lin  阅读(5)  评论(0编辑  收藏  举报