Algorithm 洪水填充算法的非递归实现?
我正在用Java开发一个小型绘图应用程序。我试图通过实现洪水填充算法来创建一个“桶填充”工具 我尝试使用递归实现,但有问题。无论如何,我在网上搜索了一下,似乎出于这个目的,推荐使用该算法的非递归实现 所以我问你: 您能否描述洪水填充算法的非递归实现?一个实际的代码示例,一些伪代码,甚至一个一般性的解释都是受欢迎的 我正在寻找最简单的,或您能想到的最有效的实现 (不必是特定于Java的)Algorithm 洪水填充算法的非递归实现?,algorithm,flood-fill,non-recursive,Algorithm,Flood Fill,Non Recursive,我正在用Java开发一个小型绘图应用程序。我试图通过实现洪水填充算法来创建一个“桶填充”工具 我尝试使用递归实现,但有问题。无论如何,我在网上搜索了一下,似乎出于这个目的,推荐使用该算法的非递归实现 所以我问你: 您能否描述洪水填充算法的非递归实现?一个实际的代码示例,一些伪代码,甚至一个一般性的解释都是受欢迎的 我正在寻找最简单的,或您能想到的最有效的实现 (不必是特定于Java的) 谢谢你我假设你有一个网格,在那里你可以得到你想要填充这个区域的位置的坐标 递归洪水填充算法是DFS。您可以执行
谢谢你我假设你有一个网格,在那里你可以得到你想要填充这个区域的位置的坐标 递归洪水填充算法是DFS。您可以执行BFS将其转换为非递归 基本上,这两种算法的思想是相似的。您有一个包,其中保存了尚未看到的节点。从包中移除节点,并将节点的有效邻居放回包中。 如果包是一堆,你会得到一个DFS。如果是排队,你会得到一个BFS 伪代码大致如下
洪水填充(x,y,检查有效性)
//这里check_validity是一个函数,给定的点坐标告诉您
//该点应为彩色或非彩色
队列q
q、 推动(x,y))
while(q不是空的)
(x1,y1)=q.pop()
颜色(x1,y1)
如果(检查_有效性(x1+1,y1))
q、 推动(x1+1,y1)
如果(检查_有效性(x1-1,y1))
q、 推动(x1-1,y1)
如果(检查_有效性(x1,y1+1))
q、 推动(x1,y1+1)
如果(检查_有效性(x1,y1-1))
q、 推动(x1,y1-1)
注意:确保检查有效性时考虑到该点是否已着色
- 深度优先搜索
- 广度优先搜索
公共非递归DFS(图G,int s){
标记=新布尔值[G.V()];
//能够迭代每个邻接列表,跟踪
//接下来需要探索每个邻接列表中的顶点
迭代器[]adj=(迭代器[])新迭代器[G.V();
对于(int v=0;v
编辑:观看此视频:
我使用上述方法得到的结果约为每秒1000万像素。我研究了它,在大约2-3分钟内用Laberinthure结构填充20亿个体素空间,避免堆栈溢出
我没有使用复杂的逻辑来跟踪以前验证过的相邻空间,而是使用了一个2D数组来记录所有验证过的空间。从已验证的阵列读取是2-3条指令:如果像素[23,23]已验证,则填充并检查其邻居并将其写入已验证的阵列(填充像素[23,23],验证像素[23+1,23]还有其他三个。代码在视频中。请查看维基百科页面上的几个非递归示例,以检查这一点:您的答案不提供SSCE,没有它很难理解您的算法。嘿,看这段视频,音频质量很抱歉,告诉我您的想法: