洛谷 P1506 拯救oibh总部 题解(洪水填充法的模板)
Posted Mark 25
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了洛谷 P1506 拯救oibh总部 题解(洪水填充法的模板)相关的知识,希望对你有一定的参考价值。
目录
题目背景
oibh 总部突然被水淹没了!现在需要你的救援……
题目描述
oibh 被突来的洪水淹没了,还好 oibh 总部有在某些重要的地方起一些围墙。用 *
号表示,而一个四面被围墙围住的区域洪水是进不去的。
oibh 总部内部也有许多重要区域,每个重要区域在图中用一个 0
表示。
现在给出 oibh 的围墙建设图,问有多少个没被洪水淹到的重要区域。
输入格式
第一行为两个正整数 x,y。
接下来 x 行,每行 y 个整数,由 *
和 0
组成,表示 oibh 总部的建设图。
输出格式
输出没被水淹没的 oibh 总部的 0
的数量。
输入输出样例
输入 #1复制
4 5 00000 00*00 0*0*0 00*00
输出 #1
1
输入 #2
5 5 ***** *0*0* **0** *0*0* *****
输出 #2
5
hack:
输入
5 5
0*000
*0000
00000
00000
00000
输出
0
说明/提示
对于 100% 的数据,1≤x,y≤500。
AC代码:
#include<bits/stdc++.h>
using namespace std;
int n,m,a[509][509],ans=0,dx[]=0,1,0,-1,dy[]=1,0,-1,0;
bool vis[509][509];
void dfs(int x,int y)
a[x][y]=1;
for(int i=0;i<4;i++)
int nx=x+dx[i],ny=y+dy[i];
if(nx<=n&&nx>=1&&ny<=m&&ny>=1&&!a[nx][ny])
dfs(nx,ny);
signed main()
ios::sync_with_stdio(false);
cin.tie(0);
cout.tie(0);
cin>>n>>m;
for(int i=1;i<=n;i++)
string s;
cin>>s;
for(int j=1;j<=m;j++)
if(s[j-1]=='0') a[i][j]=0;
else if(s[j-1]=='*') a[i][j]=1;
for(int i=1;i<=n;i++)
if(a[i][1]==0) dfs(i,1);
if(a[i][m]==0) dfs(i,m);
for(int i=1;i<=m;i++)
if(a[1][i]==0) dfs(1,i);
if(a[n][i]==0) dfs(n,i);
for(int i=1;i<=n;i++)
for(int j=1;j<=m;j++)
if(a[i][j]==0) ans++;
cout<<ans;
return 0;
总结
- 字符串读入,可用数组记录
- 洪填四角向内泛洪
- 挨个搜
- 判断并++
洛谷 P1506 拯救oibh总部DFS/Flood Fill
题目背景
oibh总部突然被水淹没了!现在需要你的救援……
题目描述
oibh被突来的洪水淹没了>.<还好oibh总部有在某些重要的地方起一些围墙,用号表示,而一个封闭的号区域洪水是进不去的……现在给出oibh的围墙建设图,问oibh总部没被淹到的重要区域(由”0”表示)有多少。
输入输出格式
输入格式:
第一行是两个数,x和y(x,y<=500)
第二行及以下是一个由*和0组成的x*y的图。
输出格式:
输出没被水淹没的oibh总部的“0”的数量。
输入输出样例
输入样例#1:
样例输入1
4 5
00000
00*00
0*0*0
00*00
输出样例#1:
样例输出1
1
以上是关于洛谷 P1506 拯救oibh总部 题解(洪水填充法的模板)的主要内容,如果未能解决你的问题,请参考以下文章