首页 > 代码库 > 拯救OIBH总部

拯救OIBH总部

拯救OIBH总部 area

【题目描述】:

OIBH总部突然被水淹没了!现在OIBH需要你的救援……

OIBH被突来的洪水淹没了>.<还好OIBH总部有在某些重要的地方起一些围墙,用*号表示,而一个封闭的*号区域洪水是进不去的……现在给出OIBH的围墙建设图,问OIBH总部没被淹到的重要区域(由"0"表示)有多少。

【输入描述】:

第一行是两个数,xyx,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 node16 {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 }
View Code

技术分享

 

拯救OIBH总部