DFS——拯救OIBH总部

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


样例输出

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

猜你喜欢

转载自blog.csdn.net/biongbiongdou/article/details/80009307
dfs
今日推荐