Floodfill——漫水填充法(也称种子填充法)
简单来说就是求一个图中独立子图的个数并将其描述出不同的状态。
Floodfill在计算机图形学有着非常广泛的运用,比如图像分割、物体识别之类。
基于Floodfill算法的实现例子有Windows下“画图”软件的油漆桶工具,photoshop的魔术棒选择工具等等。

具体算法实现方法是:查找种子点周边的点,将与种子点颜色相近的点(可以设置一个阈值)入队作为
新种子,并对新入队的种子也进行同样的扩展操作,这样就选取了和最初种子相近颜色的区域。

现在有一个问题,给你一片海域的海域图,0代表海洋,1~9都表示陆地。求这片海域有多少独立的小岛,
并将他们表示成不同的状态。

代码如下:

 #include <stdio.h>
 #include <stdlib.h>

 ][],book[][],width,lenth,sum;
 // 定义一个方向数组
 ][] = {
     { , },{ , },{ ,- },{ -, }
 };
 void DFS(int x, int y, int color)
 {
     int k, tx, ty;
     map[x][y] = color; // 对map[x][y]进行染色
     ; k < ; k++) // 枚举四种移动方式
     {
         // 下一步的坐标
         tx = x + move[k][];
         ty = y + move[k][];
         // 判断状态是否合法
          || ty< || tx>=lenth || ty>=width) continue;
          && book[tx][ty] == )
         {
             sum++;
             book[tx][ty] = ;
             DFS(tx, ty, color);
         }
     }
     return;
 }

 int main(void)
 {
     ;
     scanf("%d %d", &lenth, &width);
     // 读入地图
     ; i < lenth; i++)
         ; j < width; j++)
             scanf("%d", &map[i][j]);
     // 对每一个大于0的点尝试进行DFS染色
     ;i<lenth;i++)
         ; j < width; j++)
         {
             )
             {
                 num--; // 颜色的编号
                 // 每发现一个小岛应该染以不同的颜色,因此递减
                 book[i][j] = ;
                 DFS(i, j, num);
             }
         }
     // 打印已经染色后的地图
     ; i < lenth; i++)
     {
         ; j < width; j++)
         {
             printf("%3d", map[i][j]);
         }
         putchar('\n');
     }
     // 输出小岛的个数
     printf("有%d个小岛\n", -num);
     system("pause");

     ;
 }

可以输入以下数据进行验证:
5 5
1 2 1 0 0
3 0 2 0 1
4 0 1 0 1
3 2 0 0 0
1 0 0 5 5

运行结果如下:

-1  -1  -1  0  0

-1  0  -1  0  -2

-1  0  -1  0  -2

-1  -1  0  0  0

-1 0  0  -3  -3

Floodfill算法——求独立子图个数的更多相关文章

  1. Tarjan算法求割点

    (声明:以下图片来源于网络) Tarjan算法求出割点个数 首先来了解什么是连通图 在图论中,连通图基于连通的概念.在一个无向图 G 中,若从顶点i到顶点j有路径相连(当然从j到i也一定有路径),则称 ...

  2. floodfill算法解题示例

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

  3. Dijkstra算法求单源最短路径

    Description 在每年的校赛里,所有进入决赛的同学都会获得一件很漂亮的t-shirt.但是每当我们的工作人员把上百件的衣服从商店运回到赛场的时候,却是非常累的!所以现在他们想要寻找最短的从商店 ...

  4. ZOJ Problem - 2588 Burning Bridges tarjan算法求割边

    题意:求无向图的割边. 思路:tarjan算法求割边,访问到一个点,如果这个点的low值比它的dfn值大,它就是割边,直接ans++(之所以可以直接ans++,是因为他与割点不同,每条边只访问了一遍) ...

  5. PAT L2-013 红色警报(并查集求连通子图)

    战争中保持各个城市间的连通性非常重要.本题要求你编写一个报警程序,当失去一个城市导致国家被分裂为多个无法连通的区域时,就发出红色警报.注意:若该国本来就不完全连通,是分裂的k个区域,而失去一个城市并不 ...

  6. POJ 1986 Distance Queries (Tarjan算法求最近公共祖先)

    题目链接 Description Farmer John's cows refused to run in his marathon since he chose a path much too lo ...

  7. POJ-2195 Going Home---KM算法求最小权值匹配(存负边)

    题目链接: https://vjudge.net/problem/POJ-2195 题目大意: 给定一个N*M的地图,地图上有若干个man和house,且man与house的数量一致.man每移动一格 ...

  8. _DataStructure_C_Impl:Floyd算法求有向网N的各顶点v和w之间的最短路径

    #include<stdio.h> #include<stdlib.h> #include<string.h> typedef char VertexType[4] ...

  9. _DataStructure_C_Impl:Dijkstra算法求最短路径

    // _DataStructure_C_Impl:Dijkstra #include<stdio.h> #include<stdlib.h> #include<strin ...

随机推荐

  1. ASCII码对应表chr(num)

    chr(9) tab空格       chr(10) 换行      chr(13) 回车        Chr(13)&chr(10) 回车换行       chr(32) 空格符      ...

  2. ARM驱动调试方法、思路总结、笔记

    驱动程序的调试一. 打印: prink, 自制proc文件UBOOT传入console=ttySAC0 console=tty11. 内核处理UBOOT传入的参数console_setup add_p ...

  3. HDU 5834 Magic boy Bi Luo with his excited tree

    树形dp. 先dfs一次处理子树上的最优解,记录一下回到这个点和不回到这个点的最优解. 然后从上到下可以推出所有答案.细节较多,很容易写错. #pragma comment(linker, " ...

  4. ACdream 1726 A Math game

    深搜.不过有一个强大的剪枝.就是假设之后的全部用上都不能达到H,则return. if (A[n]-A[x-1]+summ< H) return; //A[n]表示前nx项和 #include& ...

  5. ggplot2 scale相关设置-坐标转换

    ggplot2 scale相关设置-坐标转换 在R中坐标轴转换有多种形式,包括对数转换,平方根转换以及坐标刻度前后进行调换 用到的函数分别有: scale_x_log10(...) scale_y_l ...

  6. Makefile:130: *** missing separator (did you mean TAB instead of 8 spaces?). Stop.

    修改了snmp里面的包Makefile,出现了如下问题: Makefile:130: *** missing separator (did you mean TAB instead of 8 spac ...

  7. hdu 2425 Hiking Trip (bfs+优先队列)

    Problem Description Hiking in the mountains is seldom an easy task for most people, as it is extreme ...

  8. 让人头疼的CSS兼容

    先说点Hack的知识(真正的高手是不用Hack的,但要成为高手必须通过Hack这一关) /* CSS属性级Hack */ color:red; /* 所有浏览器可识别*/ _color:red; /* ...

  9. SOUI入门

    环境:win7_64旗舰版,VS2013 发现了一个比较好用的DirectUI库——SOUI,但是写一个窗口程序不是很方便,程序初始化的地方稍显繁琐,这里稍微封装一下. 大概包含6个文件: SouiC ...

  10. CSS传统布局之display属性+float属性+position属性

    这三个属性是传统网页布局中经常用到的属性. 读这篇文章之前,希望你对css布局模型已经有了一定的了解.因为本文的三个属性是和css三个布局模型紧密联系在一起的.因此,如若你并不了解,我推荐你先看一下c ...