题目背景
oibh 总部突然被水淹没了!现在需要你的救援……
题目描述
oibh 被突来的洪水淹没了,还好 oibh 总部有在某些重要的地方起一些围墙。用 *
号表示,而一个四面被围墙围住的区域洪水是进不去的。
oibh 总部内部也有许多重要区域,每个重要区域在图中用一个 0
表示。
现在给出 oibh 的围墙建设图,问有多少个没被洪水淹到的重要区域。
输入格式
第一行为两个正整数x,y。
接下来x 行,每行 y 个整数,由 *
和 0
组成,表示 oibh 总部的建设图。
输出格式
输出没被水淹没的 oibh 总部的 0
的数量。
输入输出样例
输入 #1 输出 #1
4 5 1 00000 00*00 0*0*0 00*00
输入 #2 输出 #2
5 5 5 ***** *0*0* **0** *0*0* *****
代码如下:
#include<bits/stdc++.h>
using namespace std;
char room[505][505];
int xx[4]={-1,0,0,1}; //四个方向
int yy[4]={0,-1,1,0};
int n,m;
int ans;
#define CHECK(x,y) (x>=0&&x<=n+1&&y>=0&&y<=m+1) //检查是否合法
void dfs(int x,int y){
int dx,dy;
if(!CHECK(x,y)||room[x][y]!='0') return ; //不合法或者遇到障碍
room[x][y]='*';
for(int i=0;i<4;++i){ //四个方向继续深搜
dx=x+xx[i];
dy=y+yy[i];
dfs(dx,dy);
}
}
int main(){
cin>>n>>m;
memset(room,'0',sizeof(room)); //初始化为'0',是能够从0,0开始搜索
for(int i=1;i<=n;++i){
for(int j=1;j<=m;++j){
cin>>room[i][j];
}
}
dfs(0,0); //从0,0开始
for(int i=1;i<=n;++i){
for(int j=1;j<=m;++j){
if(room[i][j]=='0') ans++; //没有被淹没 ans++
}
}
cout<<ans;
return 0;
}