南湖的瓜 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;}
