洛谷 P1506 拯救oibh总部(DFS / 染色法)

https://www.luogu.com.cn/problem/P1506

题目描述
给定 n*m 的图形,由 * 和 0 组成。

让我们求出被*四面包围了的0的数量。
输入 #1 
4 5
00000
00*00
0*0*0
00*00
输出 #1 
1

输入 #2 
5 5
*****
*0*0*
**0**
*0*0*
*****
输出 #2 
5

也能叫染色法?

  • 这道题目需要我们需要被包围住的‘0’的数量,所以我们必须要从外围爆搜

  • 但是必须要注意的一个点就是:如果一开始是‘0’和一开始是‘*’的情况是会完全不一样的

  • 所以我们可以直接把外围扩大一圈,这样就能保证外围一定是洪水了

#include<bits/stdc++.h>
using namespace std;
typedef long long LL;
typedef pair<int,int> PII;
const int N=200200,M=2002;
LL dx[]={-1,0,0,1},dy[]={0,-1,1,0};
LL n,m,ans=0;
char a[M][M];
void dfs(LL x,LL y)
{
    //边界条件
    if(x<0||x>n+1||y<0||y>m+1||a[x][y]=='*')
        return;
    a[x][y]='*';//表示这里我已经跑过了
    for(LL i=0;i<4;i++)
    {
        dfs(x+dx[i],y+dy[i]);
    }
}
int main()
{
    cin.tie(0); cout.tie(0); ios::sync_with_stdio(false);
    int T=1;
    //cin>>T;
    while(T--)
    {
        cin>>n>>m;
        for(LL i=1;i<=n;i++)
            for(LL j=1;j<=m;j++)
            cin>>a[i][j];
        dfs(0,0);//从第一个点开始爆搜
        for(LL i=1;i<=n;i++)
        {
            for(LL j=1;j<=m;j++)
            {
                //把答案全部都涂成别的颜色,剩下来的就是答案
                if(a[i][j]=='0') ans++;
            }
        }
        cout<<ans<<endl;
    }
    return 0;
}
posted @ 2022-10-01 21:53  Vijurria  阅读(23)  评论(0编辑  收藏  举报