Flood fill算法是从一个区域中提取若干个连通的点与其他相邻区域区分开(或分别染成不同颜色)的经典算法。因为其思路类似洪水从一个区域扩散到所有能到达的区域而得名。在GNU Go扫雷中,Flood Fill算法被用来计算需要被清楚的区域。

算法实现

最简单的实现方法是采用深度优先搜索的递归方法,也可以采用广度优先搜索的迭代来实现。

  1. void flood_fill(int x,int y,int color)
  2. {
  3. area[x][y]=color;
  4. if(x>0&&area[x-1][y]==0)flood_fill(x-1,y,color);
  5. if(y>0&&area[x][y-1]==0)flood_fill(x,y-1,color);
  6. if(x<MAX_X&&area[x+1][y]==0)flood_fill(x+1,y,color);
  7. if(y<MAX_Y&&area[x][y+1]==0)flood_fill(x,y+1,color);
  8.  
  9. }
    ——————维基百科:http://zh.wikipedia.org/wiki/Flood_fill

1002: 当不成勇者的Water只好去下棋了

Time Limit: 1 Sec  Memory Limit: 128 MB
Submit: 110  Solved: 47
[Submit][Status][Web Board]

Description

由于魔王BOSS躲起来了,说好要当勇者的Water只好去下棋了,他很厉害,基本每局必输。

Water总是不知道为什么把自己的棋下得东一块西一块,而块与块之间总是被对手的棋隔开。概率统计挂了的Water一直没搞清楚到底自己被别人分成了多少块,又来找你帮忙。  
假定Water的棋为X,对手的棋为O。 
给出一个矩阵棋盘,上面布满了棋子,求Water的棋子究竟被对手分成了多少块?

(为了和谐,我们还是用0011代表OOXX)

Input

第一行为n, m。 (0 < n,m <= 100)
接下来 n 行 m 列为01矩阵。
1 为Water的棋。

Output

每组数据输出一行,表示块数。

Sample Input

  1. 2 2
  2. 01
  3. 10
  4. 2 3
  5. 101
  6. 011

Sample Output

  1. 2
  2. 2

HINT

 

Source

  1. #include<iostream>
  2. using namespace std;
  3. struct Dir {
  4. int x;
  5. int y;
  6. };
  7. struct Node {//节点的结构为:x,y为下标,dir[4]为该节点的四个方向,color用来表示是否已经被访问(不为0)以及在第几个块的,g为该节点在图中的值
  8. int x;
  9. int y;
  10. Dir dir[];
  11. int color;
  12. char g;
  13. Node() {
  14. x = ;
  15. y = ;
  16. color = ;
  17. g = ' ';
  18. dir[].x = x-;
  19. dir[].y = y;
  20. dir[].x = x;
  21. dir[].y = y+;
  22. dir[].x = x+;
  23. dir[].y = y;
  24. dir[].x = x;
  25. dir[].y = y-;
  26. }
  27. void setDir(int x_, int y_) {//设置节点的方向 ,刚做题时忘记了,搞得color值不会变化
  28. dir[].x = x_-;
  29. dir[].y = y_;
  30. dir[].x = x_;
  31. dir[].y = y_+;
  32. dir[].x = x_+;
  33. dir[].y = y_;
  34. dir[].x = x_;
  35. dir[].y = y_-;
  36. }
  37. };
  38. int color_ = ;
  39. int m;
  40. int n;
  41. bool ValidNode(Node& node, int m, int n) {//判断一个节点是否有效,在本题中有效的条件是没有越界还有该临近节点(g=1)未被访问过 ,即color=0 ,同时要使用引用才能在该函数内改变该引用变量的值
  42. if ((node.x >= && node.x < m) && (node.y >= && node.y < n)) {
  43. if (node.color == && node.g == '')
  44. return true;
  45. }
  46. return false;
  47. }
  48. void initialize(Node (*total)[]) {//初始化图
  49. char qi;
  50. for (int i = ; i < m; i++) {
  51. for (int j = ; j < n; j++) {
  52. cin >> qi;
  53. total[i][j].x = i;
  54. total[i][j].y = j;
  55. total[i][j].g = qi;
  56. total[i][j].setDir(i, j);//setDir不能忘记了,不然该节点的四个方向不能与下标x,y对应
  57. }
  58. }
  59. }
  60. void floodfill(Node (*total)[], Node& node) {//floodfill算法递归访问临近节点,并将color值修改,以表示访问过和记录在第几块,别忘了引用
  61. node.color = color_;
  62. for (int i = ; i < ; i++) {
  63. if (ValidNode(total[node.dir[i].x][node.dir[i].y], m, n))
  64. floodfill(total, total[node.dir[i].x][node.dir[i].y]);
  65. }
  66. }
  67. int main() {
  68. while (cin >> m >> n) {
  69. Node qipan[][];
  70. initialize(qipan);
  71. /*cout << "初始化的图:g+color" << endl;
  72. for (int i = 0; i < m; i++) {
  73. for (int j = 0; j < n; j++) {
  74. cout << qipan[i][j].g << qipan[i][j].color << " ";
  75. }
  76. cout << endl;
  77. }*/
  78. for (int i = ; i < m; i++) {
  79. for (int j = ; j < n; j++) {
  80. if (ValidNode(qipan[i][j], m, n)) {
  81. color_++;
  82. floodfill(qipan, qipan[i][j]);
  83. }
  84. }
  85. }
  86. /*cout << "分块后的图:g+color" << endl;
  87. for (int i = 0; i < m; i++) {
  88. for (int j = 0; j < n; j++) {
  89. cout << qipan[i][j].g << qipan[i][j].color << " ";
  90. }
  91. cout << endl;
  92. }*/
  93. /*cout << "color的值,即分为了多少块:"; */
  94. cout << color_ << endl;//此时color值就是图被分成几块
  95. color_ = ;//color_这个全局变量要复位为0,以便下一次使用
  96.  
  97. }
  98. return ;
  99. }
  100.  
  101. /**************************************************************
  102. Problem: 1002
  103. User: 12330344
  104. Language: C++
  105. Result: Accepted
  106. Time:584 ms
  107. Memory:1680 kb
  108. ****************************************************************/

输出结果:4*4为例:

图遍历算法——DFS、BFS、A*、B*和Flood Fill 遍历算法大串讲:http://dsqiu.iteye.com/blog/1689130

floodfill算法解题示例的更多相关文章

  1. FloodFill算法详解及应用

    啥是 FloodFill 算法呢,最直接的一个应用就是「颜色填充」,就是 Windows 绘画本中那个小油漆桶的标志,可以把一块被圈起来的区域全部染色. 这种算法思想还在许多其他地方有应用.比如说扫雷 ...

  2. leedcode算法解题思路

    1.两数之和 给定一个整数数组 nums 和一个目标值 target,请你在该数组中找出和为目标值的那 两个 整数,并返回他们的数组下标. 你可以假设每种输入只会对应一个答案.但是,你不能重复利用这个 ...

  3. Floodfill算法——求独立子图个数

    Floodfill--漫水填充法(也称种子填充法)简单来说就是求一个图中独立子图的个数并将其描述出不同的状态.Floodfill在计算机图形学有着非常广泛的运用,比如图像分割.物体识别之类.基于Flo ...

  4. C#与JAVA平台RSA算法交互示例

    很久以前的文章中,演示了如何对于.net和win32下面的delphi的RSA互操作性的实现,对于C#和JAVA之前的RSA加密解密也是很简单的,一般都采用了标准的规范,所以在互操作性方面是很方便的. ...

  5. RAS算法简单示例(Java版)

    RSA算法——由三位发明者Ronald Rivest.Adi Shamir 和 Leonard Adleman 姓氏的首字母拼在一起组成. RSA算法属于“公开密钥加密技术”,其加密和解密的秘钥不同. ...

  6. 《机器学习实战》之k-近邻算法(示例)

    看了这本书的第一个算法—k-近邻算法,这个算法总体构造思想是比较简单的,在ACM当中的话就对应了kd树这种结构.首先需要给定训练集,然后给出测试数据,求出训练集中与测试数据最相近的k个数据,根据这k个 ...

  7. MD5散列算法的示例

    在很多地方,都用到了数据加密,比较多的就是MD5了,也比较安全,下面就贴上个示例,输入一串字符串,通过MD5加密 加密算法如下 public static string MD5_Encrypt(str ...

  8. LaTeX 一些用法实例(并列图片、并列表格、算法代码示例、页眉太长、下划线,等)

    横向并列两个图片 \begin{figure} \begin{minipage}{0.49\linewidth} \centering \includegraphics[width=6.5cm]{Si ...

  9. 3、回溯算法解题套路框架——Go语言版

    前情提示:Go语言学习者.本文参考https://labuladong.gitee.io/algo,代码自己参考抒写,若有不妥之处,感谢指正 关于golang算法文章,为了便于下载和整理,都已开源放在 ...

随机推荐

  1. 【译文】漫谈ASP.NET中的Session

    最近这两天被一个Web Farm环境下的Session处理问题虐得很痛苦,网上到处找解决方案,在无意中翻看到这篇文章,感觉很不错,顺手查了一下,貌似没有现成的译文,于是一咬牙一跺脚把这篇文章翻译出来了 ...

  2. Swift中的问号?和感叹号!

    Swift语言使用var定义变量,但和别的语言不同,Swift里不会自动给变量赋初始值,也就是说变量不会有默认值,所以要求使用变量之前必须要对其初始化.如果在使用变量之前不进行初始化就会报错: var ...

  3. MySQL · 特性分析 · 内部临时表

    http://mysql.taobao.org/monthly/2016/06/07/#rd MySQL中的两种临时表 外部临时表 通过CREATE TEMPORARY TABLE 创建的临时表,这种 ...

  4. springMVC与struts2的区别

    1. 机制:spring mvc的入口是servlet,而struts2是filter,这样就导致了二者的机制不同. 2. 性能:spring会稍微比struts快.spring mvc是基于方法的设 ...

  5. Golang学习 - reflect 包

    ------------------------------------------------------------ 在 reflect 包中,主要通过两个函数 TypeOf() 和 ValueO ...

  6. Laravel 5.1使用命令行模式(artisan)运行php脚本

    Laravel有内置命令调度器,可以方便的实现Cron. 任务调度定义在app/Console/Kernel.php文件的schedule方法中,该方法已经包含了一个示例.Laravel里有两种方法执 ...

  7. oracle内置sql函数(转)

    转自:http://www.cnblogs.com/yening10000/archive/2009/07/02/1515284.html F.1字符函数——返回字符值 这些函数全都接收的是字符族类型 ...

  8. Play on Words 欧拉通路(回路)判断

    Play on Words note:  判断一下连通性. #include <iostream> #include <cstdio> #include <cstring ...

  9. IOS 应用中从竖屏模式强制转换为横屏模式

    在 iPhone 应用里,有时我们想强行把显示模式从纵屏改为横屏(反之亦然),CocoaChina 会员 “alienblue” 为我们提供了两种思路 第一种:通过人为的办法改变view.transf ...

  10. PHP常用文件函数和目录函数整理

    一.常用文件函数库 1.basename(); -- 返回路径中的文件名部分. string basename ( string $path [, string $suffix ] ) //给出一个包 ...