经典广搜模板题
2024-08-20 11:37:37
发布于:广东
12阅读
0回复
0点赞
能不能别用大风扇啊!!!!
#include<iostream>
#include<queue>
using namespace std;
const int N = 115;
int dx[8]={0,0,1,-1,-1,1,-1,1};
int dy[8]={-1,1,0,0,-1,1,1,-1};
char g[N][N];
int n,m;
//使用结构体存的信息
struct node{
int x,y;
}r,l;//r代表当前点,l代表下一点
queue<node> q;
//开始广搜,深搜水坑位置就变为旱地‘.’
void bfs(int x,int y){
//第一步,将起点入队,并更新为旱地
q.push({x,y});
g[x][y]= '.';
//第二步,在队列还有元素的情况下,取队首
while(q.size()){ //等同while(!q.empty())
r = q.front();
q.pop();//不能忘记弹出
//第三步,找邻居
for(int i=0;i<8;i++){
l.x = r.x + dx[i];
l.y = r.y + dy[i];
//判断是否越界、是否是水坑
if(l.x>=1 && l.x<=n && l.y>=1 && l.y<=m && g[l.x][l.y]=='W'){
//满足就放入队列,并更新为旱地'.'
q.push({l.x,l.y});
g[l.x][l.y]='.';
}
}
}
}
int main(){
cin>>n>>m;
for(int i=1;i<=n;i++){
for(int j=1;j<=m;j++){
cin>>g[i][j];
}
}
//遇到第一个水坑的位置时,就从这个位置开始广搜
int ans=0;
for(int i=1;i<=n;i++){
for(int j=1;j<=m;j++){
if(g[i][j]=='W'){
bfs(i,j);
ans++;
}
}
}
cout<<ans<<endl;
return 0;
}
这里空空如也
有帮助,赞一个