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