博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
灌水导论——灌水法初步
阅读量:5155 次
发布时间:2019-06-13

本文共 1527 字,大约阅读时间需要 5 分钟。

灌水法:

Flood Fill 直译为大水漫灌,会造成土地盐碱化。。。。。。

但是,在OI中,灌水不失为水搜索的一种好方法呢~~

灌水的思想:

灌水的思想其实就是从一个点(水源)出发,将符合条件可以到达(水可以灌到的地方)的点打标记,或者说染色。然后我们就可以通过染色的情况来处理一些问题。

空说理论没什么意义,结合一个例(shui)题说一下吧:

POJ2386 Lake Counting

题目简述:

给你一张n*m二维图,由"W"和"."组成,"."表示陆地,"W"表示水。水不流动(难度低到爆表的表现),要求求出水坑的个数(八连块)。

题解:

灌水啊~~

我们用vis[][]来记录是否找过(就是染色),每找到一个W且没有染过色的我们就从这个点灌水染色,且每次找到这样一个点就cnt++;最后输出cnt就是统计出来的数目了。

下面是很水很水的代码:

1 #include
2 using namespace std; 3 int n,m; 4 char a[105][105]; 5 int cnt=0; 6 bool vis[105][105]; 7 void flood(int x,int y) 8 { 9 if(x>n || x<1 || y<1 || y>m)return;10 vis[x][y]=true;11 if(!vis[x][y+1] && a[x][y+1]=='W')flood(x,y+1);12 if(!vis[x][y-1] && a[x][y-1]=='W')flood(x,y-1);13 if(!vis[x+1][y] && a[x+1][y]=='W')flood(x+1,y);14 if(!vis[x-1][y] && a[x-1][y]=='W')flood(x-1,y);15 if(!vis[x+1][y+1] && a[x+1][y+1]=='W')flood(x+1,y+1);16 if(!vis[x-1][y-1] && a[x-1][y-1]=='W')flood(x-1,y-1);17 if(!vis[x+1][y-1] && a[x+1][y-1]=='W')flood(x+1,y-1);18 if(!vis[x-1][y+1] && a[x-1][y+1]=='W')flood(x-1,y+1);19 }20 int main()21 {22 cin>>n>>m;23 for(int i=1;i<=n;i++)24 {25 for(int j=1;j<=m;j++)26 {27 cin>>a[i][j];28 }29 }30 for(int i=1;i<=n;i++)31 {32 for(int j=1;j<=m;j++)33 {34 if(!vis[i][j] && a[i][j]=='W')35 {36 cnt++;37 flood(i,j);38 }39 }40 }41 cout<
View Code

 

本人弱弱,求指教。

转载于:https://www.cnblogs.com/Skyvot/p/4036452.html

你可能感兴趣的文章
前端开发工具介绍----合成雪碧图工具(css sprite)
查看>>
Linux高级权限管理
查看>>
[转]Formatting the detail section to display multiple columns (水晶报表 rpt 一页多列)
查看>>
[转]小程序web-view组件
查看>>
[转]调整 VirtualBox 虚拟机的磁盘大小
查看>>
学习总结
查看>>
pip安装其他包报错
查看>>
Redis面试题及分布式集群
查看>>
发短信的简单实现——C#版
查看>>
(算法)构造最大数
查看>>
命令行开发、编译、打包Android应用程序
查看>>
Java实现HTML页面转PDF解决方案(转)
查看>>
eclipse PHP开发环境配置
查看>>
Java 反射 使用总结
查看>>
nginx https配置
查看>>
在Linux环境下mysql的root密码忘记解决方法
查看>>
我的php命名规范
查看>>
关于关闭Eclipse的控制台自动跳出
查看>>
Docker入门系列(一):目标和安排
查看>>
爬虫开发.1爬虫介绍
查看>>