拯救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; }