题目
拯救oibh总部
题目背景
oibh 总部突然被水淹没了!现在需要你的救援……
题目描述
oibh 被突来的洪水淹没了,还好 oibh 总部有在某些重要的地方起一些围墙。用 `*` 号表示,而一个四面被围墙围住的区域洪水是进不去的。
oibh 总部内部也有许多重要区域,每个重要区域在图中用一个 `0` 表示。
现在给出 oibh 的围墙建设图,问有多少个没被洪水淹到的重要区域。
输入格式
第一行为两个正整数 x,y。
接下来 x 行,每行 y 个整数,由 `*` 和 `0` 组成,表示 oibh 总部的建设图。
输出格式
输出没被水淹没的 oibh 总部的 `0` 的数量。
样例
样例输入
4 5
00000
00*00
0*0*0
00*00
样例输出
1
样例
样例输入
5 5
*****
*0*0*
**0**
*0*0*
*****
样例输出
```
5
```
提示
对于 100\%$的数据,1 \<= x,y <= 500。
思路:先标记墙的位置,再以广度优先搜索标记墙外的位置,遍历每一个洪水可以到达的地方,洪水不能出地图,也不能穿过墙,剩下的就是墙内的地方,加起来就ok。
代码:
#include<bits/stdc++.h>
using namespace std;
char office[550][550];//记录地图
int check[550][550]; //标记地图
int n,m;
void BFS(int x,int y)
{
int tx[4]={-1,1,0,0};
int ty[4]={0,0,-1,1};
if(x<0||y<0||x>n+1||y>m+1||check[x][y]==-1)//越界、洪水已经来过(标记过)、墙的位置
{
return ;
}
check[x][y]=-1;//洪水可以蔓延到的地方,标记为-1
for(int i=0;i<4;i++)
{
BFS(x+tx[i],y+ty[i]);//向前后左右四个方向遍历,寻找洪水可以到达的位置
}
}
int main()
{
cin>>n>>m;
for(int i=1;i<=n;i++)
{
for(int j=1;j<=m;j++)
{
cin>>office[i][j];
if(office[i][j]=='*')
{
check[i][j]=-1;//墙的位置,标记为-1
}
else
{
check[i][j]=1;//待判断的位置
}
}
}
BFS(0,0);
long long sum=0;
for(int i=1;i<=n;i++)
{
for(int j=1;j<=m;j++)
{
if(check[i][j]==1)//只有被墙围起来的位置未被标记为-1
{
sum++;
}
}
}
cout<<sum;
return 0;
}