拯救OIBH总部 area
【题目描述】:
OIBH总部突然被水淹没了!现在OIBH需要你的救援……
OIBH被突来的洪水淹没了>.<还好OIBH总部有在某些重要的地方起一些围墙,用*号表示,而一个封闭的*号区域洪水是进不去的……现在给出OIBH的围墙建设图,问OIBH总部没被淹到的重要区域(由"0"表示)有多少。
【输入描述】:
第一行是两个数,x和y(x,y<=500)
第二行及以下是一个由*和0组成的x*y的图。
【输出描述】:
输出没被水淹没的OIBH总部的“0”的数量。
【样例输入】 |
【样例输出】 |
4 5 00000 00*00 0*0*0 00*00 |
1 |
5 5 ***** *0*0* **0** *0*0* ***** |
5 |
【数据范围及描述】:
搜索水题,我并不想多讲
1 #include <iostream> 2 #include <cstdio> 3 #include <cstring> 4 #include <algorithm> 5 #include <queue> 6 using namespace std; 7 8 const int maxn=505; 9 const int dx[]={1,-1,0,0}; 10 const int dy[]={0,0,1,-1}; 11 char g[maxn][maxn]; 12 bool vis[maxn][maxn]; 13 int n,m; 14 15 struct node 16 { 17 int x,y; 18 }; 19 20 int bfs(int x,int y) 21 { 22 queue<node> Q; 23 node top; 24 Q.push((node){x,y}); 25 vis[x][y]=true; 26 bool flag=true; 27 int cnt(1); 28 while(!Q.empty()) 29 { 30 top=Q.front(); 31 Q.pop(); 32 if(top.x==1||top.x==n||top.y==1||top.y==m) flag=false; 33 for(int i=0;i<4;i++) 34 { 35 int xx=top.x+dx[i]; 36 int yy=top.y+dy[i]; 37 if(xx<1||xx>n||yy<1||yy>m) 38 { 39 flag=false; 40 continue; 41 } 42 if(!vis[xx][yy]&&g[xx][yy]==‘0‘) 43 { 44 vis[xx][yy]=true; 45 Q.push((node){xx,yy}); 46 cnt++; 47 } 48 } 49 } 50 if(flag) return cnt; 51 return 0; 52 } 53 54 55 56 int main() 57 { 58 scanf("%d %d\n",&n,&m); 59 for(int i=1;i<=n;i++) 60 gets(g[i]+1); 61 memset(vis,false,sizeof(vis)); 62 int ans(0); 63 for(int i=1;i<=n;i++) 64 for(int j=1;j<=m;j++) 65 { 66 if(g[i][j]==‘0‘&&!vis[i][j]) 67 ans+=bfs(i,j); 68 } 69 printf("%d",ans); 70 return 0; 71 }
时间: 2024-12-21 14:15:32