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