灌水导论——灌水法初步

灌水法:

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

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

灌水的思想:

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

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

POJ2386 Lake Counting

题目简述:

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

题解:

灌水啊~~

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

下面是很水很水的代码:

 1 #include<iostream>
 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<<cnt;
42     return 0;
43 }

本人弱弱,求指教。

时间: 2024-08-10 11:09:08

灌水导论——灌水法初步的相关文章

bzoj1601【Usaco2008 Oct】灌水

1601: [Usaco2008 Oct]灌水 Time Limit: 5 Sec  Memory Limit: 162 MB Submit: 1589  Solved: 1035 [Submit][Status][Discuss] Description Farmer John已经决定把水灌到他的n(1<=n<=300)块农田,农田被数字1到n标记.把一块土地进行灌水有两种方法,从其他农田饮水,或者这块土地建造水库. 建造一个水库需要花费wi(1<=wi<=100000),连接两

BZOJ1601: [Usaco2008 Oct]灌水

1601: [Usaco2008 Oct]灌水 Time Limit: 5 Sec  Memory Limit: 162 MBSubmit: 1280  Solved: 839[Submit][Status] Description Farmer John已经决定把水灌到他的n(1<=n<=300)块农田,农田被数字1到n标记.把一块土地进行灌水有两种方法,从其他农田饮水,或者这块土地建造水库. 建造一个水库需要花费wi(1<=wi<=100000),连接两块土地需要花费Pij(1

灌水VS抽水

灌水VS抽水 Time Limit : 3000/1000ms (Java/Other)   Memory Limit : 65535/32768K (Java/Other) Total Submission(s) : 25   Accepted Submission(s) : 4 Font: Times New Roman | Verdana | Georgia Font Size: ← → Problem Description There is something crazy! There

洛谷P2661 信息传递 类似tarjan 强连通 灌水

洛谷P2661 信息传递类似tarjan 强连通 灌水 题意 求一个特殊的图的最小环 这个图 有一个性质 每个点只有一条出边 这样满足一个性质,一张图只有 一个环,以及别的连向他们的边都是一些连向 或者 间接连向这个环的树枝 这些树枝一定不会连成环,因为 每个点只有一条出边,而不可能有两条,所以只要把这些树枝边都删掉,然后再类似tarjan一样跑一遍灌水就行了 先说一下思路,这整道题就是给你几个带枝叶的环要你求最短环而已,于是在输入的时候可以把图中每个点的入度记录下来,然后再删除那些入度为0的点

[BZOJ1601] [Usaco2008 Oct] 灌水 (kruskal)

Description Farmer John已经决定把水灌到他的n(1<=n<=300)块农田,农田被数字1到n标记.把一块土地进行灌水有两种方法,从其他农田饮水,或者这块土地建造水库. 建造一个水库需要花费wi(1<=wi<=100000),连接两块土地需要花费Pij(1<=pij<=100000,pij=pji,pii=0). 计算Farmer John所需的最少代价. Input *第一行:一个数n *第二行到第n+1行:第i+1行含有一个数wi *第n+2行到

同盾反欺诈云防垃圾灌水帖体验分享

年初将留言本改成了松松论坛,解决了留言本很多问题,也有了互动性,增强了粘性. 不过随后遇到了很多问题,尤其是垃圾贴的问题困扰了我们很久,有一段时间有人用论坛群发器发布了很多垃圾贴,原本只有几千条的帖子,一晚上就被刷了50多万条垃圾帖. 后来做过很多防范措施,例如装了防灌水插件.设置关键词黑名单,设用户黑名单等等,但都收效甚微.现在不得已关闭用户注册,全部改成QQ开放平台的QQ号登陆. 在这个过程中,也有不少热心朋友推荐了一些防灌水工具,测试过后发现网名为西北飞哥的朋友介绍的效果最好,也是松松论坛

1601: [Usaco2008 Oct]灌水

1601: [Usaco2008 Oct]灌水 Time Limit: 5 Sec  Memory Limit: 162 MB Submit: 1342  Solved: 881 [Submit][Status] Description Farmer John已经决定把水灌到他的n(1<=n<=300)块农田,农田被数字1到n标记.把一块土地进行灌水有两种方法,从其他农田饮水,或者这块土地建造水库. 建造一个水库需要花费wi(1<=wi<=100000),连接两块土地需要花费Pij

Grass Gis 峡谷堰塞湖预测模型r.lake剖析--湖心灌水洪泛算法

Grass Gis 是20世纪80年代初,美国军方建筑工程研究实验室(USA/CERL)的Bill Gorgan负责遴选一款具有土地管理.环境规划.环境评估的GIS软件.它有400多个地质分析模块,今天我们剖析一下r.lake算法. 1. 堰塞湖预测建模r.lake能做什么 如下图1左为一张地形栅格图,也是最常见的2D平面图.从图中可以看到许多的凹地盆地,当有山洪暴雨时就会形成堰塞湖. Grass Gis 的r.lake就是能够预测堰塞湖形状大小的模块.例如,在图1左所示的红色圆圈位置开始注水当

【最小生成树】Bzoj1601[Usaco2008 Oct]灌水

Description Farmer John已经决定把水灌到他的n(1<=n<=300)块农田,农田被数字1到n标记.把一块土地进行灌水有两种方法,从其他农田饮水,或者这块土地建造水库. 建造一个水库需要花费wi(1<=wi<=100000),连接两块土地需要花费Pij(1<=pij<=100000,pij=pji,pii=0). 计算Farmer John所需的最少代价. Sulotion 直接搞好像不太好做?于是新设一个点,作为总水源,和i点边权为wi,然后直接求