防御洪水
Time Limit:1000ms
Memory Limit:65536K
Description
OIBH被突来的洪水淹没了> .< 还好OIBH总部有在某些重要的地方起一些围墙,用*号表示,而一个封闭的*号区域洪水是进不去的……现在给出OIBH的围墙建设图,问OIBH总部没被淹到的重要区域(由" 0" 表示)有多少。
Input
第一行是两个数,x和y(x,y< =500) 第二行及以下是一个由*和0组成的x*y的图。
Output
输出没被水淹没的OIBH总部的“0”的数量。
Sample Input
5 4
00000
00*00
0*0*0
00*00
5 5
*****
*0*0*
**0**
*0*0*
*****
Sample Output
1
5
思路
首先将连通的区域进行标记,然后遍历剩余未标记累积求和。个人认为此题还是比较简单。
#include <iostream>
#include <algorithm>
#include <cstring>
using namespace std;
char num[505][505];
bool flag[505][505];
int dir[4][2] = {0,1,1,0,-1,0,0,-1};
int n,m;
void dfs(int x,int y)
{
if(x>=n||x<0||y<0||y>=m||flag[x][y]==1||num[x][y] == '*')
{
return ;
}
if(num[x][y] == '0')
{
num[x][y] = '-';
flag[x][y] = 1;
}
for(int i=0;i<4;i++)
{
dfs(x+dir[i][0],y+dir[i][1]);
}
return;
}
int main()
{
while(cin>>m>>n)
{
memset(flag,0,sizeof(flag));
for(int i=0;i<n;i++)
for(int j=0;j<m;j++)
cin>>num[i][j];
for(int i=0;i<n;i++)
for(int j=0;j<m;j++)
{
if((i==0||i==n-1||j==0||j==m-1)&&num[i][j]=='0')
{
dfs(i,j);
}
}
int cot=0;
for(int i=0;i<n;i++)
{
for(int j=0;j<m;j++)
if(num[i][j]=='0')
cot++;
}
cout<<cot<<endl;
}
return 0;
}