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

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章