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

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

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

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

代码如下:

 1 #include <stdio.h>
 2 #include <stdlib.h>
 3
 4 int map[100][100],book[100][100],width,lenth,sum;
 5 // 定义一个方向数组
 6 int move[4][2] = {
 7     { 0,1 },{ 1,0 },{ 0,-1 },{ -1,0 }
 8 };
 9 void DFS(int x, int y, int color)
10 {
11     int k, tx, ty;
12     map[x][y] = color; // 对map[x][y]进行染色
13     for (k = 0; k < 4; k++) // 枚举四种移动方式
14     {
15         // 下一步的坐标
16         tx = x + move[k][0];
17         ty = y + move[k][1];
18         // 判断状态是否合法
19         if (tx < 0 || ty<0 || tx>=lenth || ty>=width) continue;
20         if (map[tx][ty] > 0 && book[tx][ty] == 0)
21         {
22             sum++;
23             book[tx][ty] = 1;
24             DFS(tx, ty, color);
25         }
26     }
27     return;
28 }
29
30 int main(void)
31 {
32     int i, j, num = 0;
33     scanf("%d %d", &lenth, &width);
34     // 读入地图
35     for (i = 0; i < lenth; i++)
36         for (j = 0; j < width; j++)
37             scanf("%d", &map[i][j]);
38     // 对每一个大于0的点尝试进行DFS染色
39     for(i=0;i<lenth;i++)
40         for (j = 0; j < width; j++)
41         {
42             if (map[i][j] > 0)
43             {
44                 num--; // 颜色的编号
45                 // 每发现一个小岛应该染以不同的颜色,因此递减
46                 book[i][j] = 1;
47                 DFS(i, j, num);
48             }
49         }
50     // 打印已经染色后的地图
51     for (i = 0; i < lenth; i++)
52     {
53         for (j = 0; j < width; j++)
54         {
55             printf("%3d", map[i][j]);
56         }
57         putchar(‘\n‘);
58     }
59     // 输出小岛的个数
60     printf("有%d个小岛\n", -num);
61     system("pause");
62
63     return 0;
64 }

可以输入以下数据进行验证:
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

时间: 2024-10-06 00:45:18

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

算法 - 求n个数的中位数(C++)

placeholder算法 - 求n个数的中位数(C++),布布扣,bubuko.com

_DataStructure_C_Impl:Dijkstra算法求最短路径

// _DataStructure_C_Impl:Dijkstra #include<stdio.h> #include<stdlib.h> #include<string.h> typedef char VertexType[4]; typedef char InfoPtr; typedef int VRType; #define INFINITY 100000 //定义一个无限大的值 #define MaxSize 50 //最大顶点个数 typedef int P

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

#include<stdio.h> #include<stdlib.h> #include<string.h> typedef char VertexType[4]; typedef char InfoPtr; typedef int VRType; #define INFINITY 100000 //定义一个无限大的值 #define MaxSize 50 //最大顶点个数 typedef int PathMatrix[MaxSize][MaxSize][MaxSiz

高效率求约数的个数

高效率求约数的个数 求约数的个数方法有很多,你可以使用O(n)的方法来遍历看是否为约数,更可以使用复杂度的算法从1~来判断个数,但是在这里我们给出的是一种稍快于的方法,大概节省2/3左右的时间. 题目描述: 输入n个整数,依次输出每个数的约数的个数 输入: 输入的第一行为N,即数组的个数(N<=1000) 接下来的1行包括N个整数,其中每个数的范围为(1<=Num<=1000000000) 当N=0时输入结束. 输出: 可能有多组输入数据,对于每组输入数据, 输出N行,其中每一行对应上面

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

题目链接: https://vjudge.net/problem/POJ-2195 题目大意: 给定一个N*M的地图,地图上有若干个man和house,且man与house的数量一致.man每移动一格需花费$1(即单位费用=单位距离),一间house只能入住一个man.现在要求所有的man都入住house,求最小费用. 思路: KM算法传送门: 理解篇    运用篇 每个man和house建立带权二分图,曼哈顿距离就是边的值,这里要求最小费用,也就是二分图最小权值匹配,但是KM算法求的是二分图最

如何防范算法求逆

假如您不幸遇到对Win32应用环境有足够了解的对手,以至于您的软件最终还是被凶悍的调试器任意蹂躏.但是您还远没有被打败,如果反调试技术(Anti-Debug)作为软件保护的第一道防线已经失守,您的对手只不过是掌握了一大堆汇编代码而已,毕竟代码和算法之间还是有相当距离的,所以您还有第二道防线可守--抗分析.在这道防线里,您有很多办法可以限制破解者掌握您的加密算法,从而阻止注册机或者破解补丁的出现. 一.前言 软件保护的目的是只向合法用户提供完整的功能,所以软件保护必然要包括验证用户合法性的环节,而

利用Kruskal算法求最小生成树解决聪明的猴子问题 -- 数据结构

题目:聪明的猴子 链接:https://ac.nowcoder.com/acm/problem/19964 在一个热带雨林中生存着一群猴子,它们以树上的果子为生.昨天下了一场大雨,现在雨过天晴,但整个雨林的地 表还是被大水淹没着,部分植物的树冠露在水面上.猴子不会游泳,但跳跃能力比较强,它们仍然可以在露出水面 的不同树冠上来回穿梭,以找到喜欢吃的果实.现在,在这个地区露出水面的有N棵树,假设每棵树本身的直径都 很小,可以忽略不计.我们在这块区域上建立直角坐标系,则每一棵树的位置由其所对应的坐标表

最短路径--弗洛伊德算法[求任意一对顶点间的最短路径]

转自大神:https://www.cnblogs.com/wangyuliang/p/9216365.html !!!!!!!!!!!!!!!!!!!!!!!!!注意             迪杰斯特拉算法和弗洛伊德算法(求最短路径) 都是有向图!!!!单边的 暑假,小哼准备去一些城市旅游.有些城市之间有公路,有些城市之间则没有,如下图.为了节省经费以及方便计划旅程,小哼希望在出发之前知道任意两个城市之前的最短路程. 上图中有4个城市8条公路,公路上的数字表示这条公路的长短.请注意这些公路是单向

KM(Kuhn-Munkres)算法求带权二分图的最佳匹配

KM(Kuhn-Munkres)算法求带权二分图的最佳匹配 相关概念 这个算法个人觉得一开始时有点难以理解它的一些概念,特别是新定义出来的,因为不知道是干嘛用的.但是,在了解了算法的执行过程和原理后,这些概念的意义和背后的作用就渐渐的显示出来了.因此,先暂时把相关概念列出来,看看,有个大概印象就好,等到了解了算法的流程后,在看原理中会有这些概念,那个时候回来细看就好了. 完备匹配:定义 设G=<V1,V2,E>为二部图,|V1|≤|V2|,M为G中一个最大匹配,且|M|=|V1|,则称M为V1