拯救OIBH总部(来源于http://acm.qust.edu.cn/problem.php?id=1101)
OIBH被突来的洪水淹没了> .< 还好OIBH总部有在某些重要的地方起一些围墙,用*号表示,而一个封闭的*号区域洪
水是进不去的……现在给出OIBH的围墙建设图,问OIBH总部没被淹到的重要区域(由" 0" 表示)有多少。
输入
第一行是两个数,x和y(x,y< =500) 第二行及以下是一个由*和0组成的x*y的图。
输出
输出没被水淹没的OIBH总部的“0”的数量。
样例输入
5 4
00000
00*00
0*0*0
00*00
00000
00*00
0*0*0
00*00
样例输出
1
//
// main.cpp
// DFS-拯救OIBH总部
//
// Created by showlo on 2018/4/19.
// Copyright © 2018年 showlo. All rights reserved.
//
#include <stdio.h>
#include <algorithm>
#include <math.h>
using namespace std;
#define max 1000
int m,n;
char a[max][max];
int vis[max][max];
void dfs(int x,int y){
int dx[4]={1,0,-1,0};
int dy[4]={0,1,0,-1};
if (a[x][y]=='*'||vis[x][y]==1||x<0||x>=m||y<0||y>=n)
return ;
else{
// printf("%d %d\n",x,y);
vis[x][y]=1;
for(int i=0;i<4;i++)
dfs(x+dx[i], y+dy[i]);
}
return;
}
int main() {
int i,j,ans=0;
scanf("%d %d",&n,&m);
memset(vis, 0, sizeof(vis));
for (i=0; i<m; i++) {
scanf("%s",a[i]);
}
for (i=0; i<m; i++) {
if (a[i][0]!='*'&&vis[i][0]==0)
dfs(i,0);
if (a[i][n-1]!='*'&&vis[i][n-1]==0)
dfs(i,n-1);
}
for (i=1; i<n-2; i++) {
if (a[0][i]!='*'&&vis[0][i]==0)
dfs(0,i);
if (a[m-1][i]!='*'&&vis[m-1][i]==0)
dfs(m-1,i);
}
for (i=0; i<n; i++) {
for (j=0; j<m; j++) {
if (a[i][j]=='0'&&vis[i][j]==0) {
ans++;
}
}
}
printf("%d\n",ans);
return 0;
}