题目描述
oibh被突来的洪水淹没了>.<还好oibh总部有在某些重要的地方起一些围墙,用号表示,而一个封闭的号区域洪水是进不去的……现在给出oibh的围墙建设图,问oibh总部没被淹到的重要区域(由"0"表示)有多少。
输入格式
第一行是两个数,x和y(x,y<=500)第二行及以下是一个由和0组成的xy的图。
输出格式
输出没被水淹没的oibh总部的“0”的数量。
样例输入1
4 5
00000
00*00
0*0*0
00*00
样例输入2
5 5
*****
*0*0*
**0**
*0*0*
*****
从四面八方进行宽搜,最后找出没有搜到的个数
代码如下:
#include<bits/stdc++.h>
using namespace std;
int dx[4]={0,-1,0,1};
int dy[4]={-1,0,1,0};
const int N=1000;
char f[N][N];
int x,y;
void bfs(int aa,int bb)
{
f[aa][bb]='2';
for(int i=0;i<4;i++)
{
int a=aa+dx[i],b=bb+dy[i];
if(f[a][b]=='0' && a>=0 &&a<x &&b>=0 &&b<y)
{
f[a][b]='2';
bfs(a,b);
}
}
}
int main()
{
int cnt=0;
cin>>x>>y;
for(int i=0;i<x;i++)
for(int j=0;j<y;j++)
cin>>f[i][j];
for(int i=0;i<x;i++)
{
if(f[i][0]=='0') bfs(i,0); //第一列
if(f[i][y-1]=='0') bfs(i,y-1);//最后一列
}
for(int j=0;j<y;j++)
{
if(f[0][j]=='0') bfs(0,j); //第一行
if(f[x-1][j]=='0') bfs(x-1,j);//最后一行
}
for(int i=0;i<x;i++)
for(int j=0;j<y;j++)
if(f[i][j]=='0') cnt++;
cout<<cnt;
return 0;
}