南湖的瓜 BFS求连通块
现给出一个n×m的地图,代表小c的瓜地,‘#’代表地雷,‘*’代表西瓜,‘.’代表空地,恶人zzh不能踩到地雷,不然他就被炸死了,恶人zzh能从任意位置开始偷瓜,他也能从任意位置选择离开,但是除了使用技能的时候,他只能上下左右走动。请聪明的你算一算小c最多能被恶人zzh偷多少个西瓜。使用技能可以从任意的位置到任意的位置。
思路:
读完题之后,很容易就有思路,这不就是BFS,遍历每一个起点,扩展连通块最大是多少。取最大的两个连通块加起来。
代码:
#include<bits/stdc++.h>
using namespace std;
struct node{
int x,y;
};
queue<node> q;
int vis[510][510];
int dx[]={0,1,0,-1};
int dy[]={1,0,-1,0};
int n,m;
char g[510][510];
int bfs(int x,int y){
while(!q.empty()) q.pop();
int res=0;
node temp={x,y};
q.push(temp);
vis[x][y]=1;
while(!q.empty()){
node now=q.front();
// cout<<now.x<<" "<<now.y<<endl;
q.pop();
if(g[now.x][now.y]=='*') res++;
for(int i=0;i<4;i++){
node next;
next.x=now.x+dx[i];
next.y=now.y+dy[i];
if(next.x<0 || next.x>=n || next.y<0 || next.y>=m||g[next.x][next.y]=='#') continue;
if(vis[next.x][next.y]==0){
// cout<<next.x<<" "<<next.y<<endl;
vis[next.x][next.y]=true;
q.push(next);
}
}
}
return res;
}
int main(){
cin>>n>>m;
for(int i=0;i<n;i++){
for(int j=0;j<m;j++){
cin>>g[i][j];
vis[i][j]=0;
}
}
vector<int> ans;
for(int i=0;i<n;i++){
for(int j=0;j<m;j++){
if(g[i][j]!='#'&&!vis[i][j]) ans.push_back(bfs(i,j));
}
}
sort(ans.begin(),ans.end());
if(ans.size()>=2) cout<<ans.back()+ans[ans.size()-2]<<endl;
else if(ans.size()==1) cout<<ans.back()<<endl;
else cout<<0<<endl;
}