南湖的瓜 BFS求连通块

现给出一个n×m的地图,代表小c的瓜地,‘#’代表地雷,‘*’代表西瓜,‘.’代表空地,恶人zzh不能踩到地雷,不然他就被炸死了,恶人zzh能从任意位置开始偷瓜,他也能从任意位置选择离开,但是除了使用技能的时候,他只能上下左右走动。请聪明的你算一算小c最多能被恶人zzh偷多少个西瓜。使用技能可以从任意的位置到任意的位置。

思路:

读完题之后,很容易就有思路,这不就是BFS,遍历每一个起点,扩展连通块最大是多少。取最大的两个连通块加起来。

代码:

  1. #include<bits/stdc++.h>
  2. using namespace std;
  3. struct node{
  4. int x,y;
  5. };
  6. queue<node> q;
  7. int vis[510][510];
  8. int dx[]={0,1,0,-1};
  9. int dy[]={1,0,-1,0};
  10. int n,m;
  11. char g[510][510];
  12. int bfs(int x,int y){
  13. while(!q.empty()) q.pop();
  14. int res=0;
  15. node temp={x,y};
  16. q.push(temp);
  17. vis[x][y]=1;
  18. while(!q.empty()){
  19. node now=q.front();
  20. // cout<<now.x<<" "<<now.y<<endl;
  21. q.pop();
  22. if(g[now.x][now.y]=='*') res++;
  23. for(int i=0;i<4;i++){
  24. node next;
  25. next.x=now.x+dx[i];
  26. next.y=now.y+dy[i];
  27. if(next.x<0 || next.x>=n || next.y<0 || next.y>=m||g[next.x][next.y]=='#') continue;
  28. if(vis[next.x][next.y]==0){
  29. // cout<<next.x<<" "<<next.y<<endl;
  30. vis[next.x][next.y]=true;
  31. q.push(next);
  32. }
  33. }
  34. }
  35. return res;
  36. }
  37. int main(){
  38. cin>>n>>m;
  39. for(int i=0;i<n;i++){
  40. for(int j=0;j<m;j++){
  41. cin>>g[i][j];
  42. vis[i][j]=0;
  43. }
  44. }
  45. vector<int> ans;
  46. for(int i=0;i<n;i++){
  47. for(int j=0;j<m;j++){
  48. if(g[i][j]!='#'&&!vis[i][j]) ans.push_back(bfs(i,j));
  49. }
  50. }
  51. sort(ans.begin(),ans.end());
  52. if(ans.size()>=2) cout<<ans.back()+ans[ans.size()-2]<<endl;
  53. else if(ans.size()==1) cout<<ans.back()<<endl;
  54. else cout<<0<<endl;
  55. }