防御洪水【dfs深度搜索】

防御洪水

Time Limit:1000ms

Memory Limit:65536K

Description

OIBH被突来的洪水淹没了> .< 还好OIBH总部有在某些重要的地方起一些围墙,用*号表示,而一个封闭的*号区域洪水是进不去的……现在给出OIBH的围墙建设图,问OIBH总部没被淹到的重要区域(由" 0" 表示)有多少。

Input

第一行是两个数,x和y(x,y< =500) 第二行及以下是一个由*和0组成的x*y的图。

Output

输出没被水淹没的OIBH总部的“0”的数量。

Sample Input

5 4
00000
00*00
0*0*0
00*00
5 5
*****
*0*0*
**0**
*0*0*
*****

Sample Output

1
5

思路

首先将连通的区域进行标记,然后遍历剩余未标记累积求和。个人认为此题还是比较简单。

#include <iostream>
#include <algorithm>
#include <cstring>
using namespace std;
char num[505][505];
bool flag[505][505];
int dir[4][2] = {0,1,1,0,-1,0,0,-1};
int n,m;
void dfs(int x,int y)
{
    if(x>=n||x<0||y<0||y>=m||flag[x][y]==1||num[x][y] == '*')
    {
        return ;
    }
    if(num[x][y] == '0')
    {
        num[x][y] = '-';
        flag[x][y] = 1;
    }
    for(int i=0;i<4;i++)
    {
        dfs(x+dir[i][0],y+dir[i][1]);
    }
    return;
   
}
int main()
{
    while(cin>>m>>n)
    {
        memset(flag,0,sizeof(flag));
        for(int i=0;i<n;i++)
            for(int j=0;j<m;j++)
                cin>>num[i][j];
        for(int i=0;i<n;i++)
            for(int j=0;j<m;j++)
            {
                if((i==0||i==n-1||j==0||j==m-1)&&num[i][j]=='0')
                {
                   dfs(i,j);
                }
            }
        int cot=0;
        for(int i=0;i<n;i++)
        {
            for(int j=0;j<m;j++)
                if(num[i][j]=='0')
                    cot++;
        }
        cout<<cot<<endl;
    }
    return 0;
}

猜你喜欢

转载自blog.csdn.net/weixin_43532890/article/details/83447164