floodfill
C语言中的函数
floodfill为C语言中的一个函数。
函数名
floodfill
功 能
用指定颜色填充一个密闭区域,相当于画图中的油漆桶。
用 法
void far floodfill(int x, int y, COLORREF color);
程序例
代码实现
PASCAL实现:
函数算法
FloodFill是一种图论算法,对于一个图来说,可以很方便的求子图的个数。伪代码描述如下
# component(i) denotes the
# component that node i is in
1 function flood_fill(new_component)
2 do
3 num_visited = 0
4 for all nodes i
5  if component(i) = -2
6  num_visited = num_visited + 1
7  component(i) = new_component
8  for all neighbors j of node i
9  if component(j) = nil
10  component(j) = -2
11  until num_visited = 0
12 function find_components
13  num_components = 0
14 for all nodes i
15  component(node i) = nil
16 for all nodes i
17  if component(node i) is nil
18  num_components =
num_components + 1
19  component(i) = -2
20  flood_fill(component num_components)
可以用深度优先遍历广度优先遍历和广度优先扫描(速度很慢)来实现,上面代码实现的是广度优先扫描
其它算法的详细实现如下:
深搜:取一个结点,对其标记,然后标记它所有的邻结点。对它的每一个邻结点这么一直递归下去完成搜索。
广搜:与深搜不同的是,广搜把结点加入队列中。
广度扫描(不常见):每个结点有两个值,一个用来记录它属于哪个连通子图(c),一个用来标记是否已经访问(v)。算法对每一个未访问而在某个连通子图当中的结点扫描,将其标记访问,然后把它的邻结点的(c)值改为当前结点的(c)值。
深搜最容易写,但它需要一个栈。搜索显式图没问题,而对于隐式图,栈可能就存不下了。
广搜稍微好一点,不过也存在问题。搜索大的图它的队列有可能存不下。深搜和广搜时间复杂度均为O(N+M)。其中,N为结点数,M为边数。
广度扫描需要的额外空间很少,或者可以说根本不要额外空间,但是它很慢。时间复杂度是O(N^2+M)
节点变化如下(没有显示即值为nil,左边是节点编号,右边是Component的值)
第一步
1 -2
第二步
1 1
4 -2
第三步
1 1
4 1
8 -2
第四步
1 1
4 1
8 1
第一次扫描结束,下面找到第一个nil的节点2,继续扫描
第五步
1 1
2 -2
4 1
8 1
第六步
1 1
2 2
4 1
7 -2
8 1
9 -2
第七步
1 1
2 2
4 1
5 -2
7 2
8 1
9 -2
第八步
1 1
2 2
4 1
5 -2
7 2
8 1
9 2
第九步
1 1
2 2
4 1
5 2
6 -2
7 2
8 1
9 2
第十步
1 1
2 2
4 1
5 2
6 2
7 2
8 1
9 2
没有-2的节点了,下面继续寻找nil节点,找到3
第11步
1 1
2 2
3 -2
4 1
5 2
6 2
7 2
8 1
9 2
第12步
1 1
2 2
3 3
4 1
5 2
6 2
7 2
8 1
9 2
参考资料
floodfill.nocow.
最新修订时间:2024-02-20 17:22
目录
概述
函数名
功 能
用 法
程序例
参考资料