Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/visual-studio-2010/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Algorithm 洪水填充算法的非递归实现?_Algorithm_Flood Fill_Non Recursive - Fatal编程技术网

Algorithm 洪水填充算法的非递归实现?

Algorithm 洪水填充算法的非递归实现?,algorithm,flood-fill,non-recursive,Algorithm,Flood Fill,Non Recursive,我正在用Java开发一个小型绘图应用程序。我试图通过实现洪水填充算法来创建一个“桶填充”工具 我尝试使用递归实现,但有问题。无论如何,我在网上搜索了一下,似乎出于这个目的,推荐使用该算法的非递归实现 所以我问你: 您能否描述洪水填充算法的非递归实现?一个实际的代码示例,一些伪代码,甚至一个一般性的解释都是受欢迎的 我正在寻找最简单的,或您能想到的最有效的实现 (不必是特定于Java的) 谢谢你我假设你有一个网格,在那里你可以得到你想要填充这个区域的位置的坐标 递归洪水填充算法是DFS。您可以执行

我正在用Java开发一个小型绘图应用程序。我试图通过实现洪水填充算法来创建一个“桶填充”工具

我尝试使用递归实现,但有问题。无论如何,我在网上搜索了一下,似乎出于这个目的,推荐使用该算法的非递归实现

所以我问你:

您能否描述洪水填充算法的非递归实现?一个实际的代码示例,一些伪代码,甚至一个一般性的解释都是受欢迎的

我正在寻找最简单的,您能想到的最有效的实现

(不必是特定于Java的)


谢谢你

我假设你有一个网格,在那里你可以得到你想要填充这个区域的位置的坐标

递归洪水填充算法是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)
注意:确保检查有效性时考虑到该点是否已着色


  • 深度优先搜索
  • 广度优先搜索

基本上有两种方法可以非递归地实现洪水填充算法。Sukunt已经清楚地解释了第一种方法,其中使用队列实现广度优先搜索

或者,您可以通过使用隐式堆栈以非递归方式实现递归DFS。例如,以下代码在节点为整数的图上实现非递归DFS。在这段代码中,您使用一个迭代器数组来跟踪每个节点邻接列表中处理过的邻居。可以访问完整的代码

公共非递归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,没有它很难理解您的算法。嘿,看这段视频,音频质量很抱歉,告诉我您的想法: