我正在尝试实现类似泛洪的算法.问题是我不知道我应该以什么方式实现它,例如递归 – 非递归. 我知道每个都有缺陷,但其中一个必须比另一个快.当非递归每次分配4个新点时,递归在堆栈
我知道每个都有缺陷,但其中一个必须比另一个快.当非递归每次分配4个新点时,递归在堆栈上打开新函数.
非迭代的示例:
Stack<Point> stack = new Stack<Point>(); stack.Push(q); while (stack.Count > 0) { Point p = stack.Pop(); int x = p.X; int y = p.Y; if (y < 0 || y > h - 1 || x < 0 || x > w - 1) continue; byte val = vals[y, x]; if (val == SEED_COLOR) { vals[y, x] = COLOR; stack.Push(new Point(x + 1, y)); stack.Push(new Point(x - 1, y)); stack.Push(new Point(x, y + 1)); stack.Push(new Point(x, y - 1)); } }
编辑:我将在600X600像素的地图上应用以下算法.尽管洪水填充不会应用于整个地图,但每次迭代它应覆盖约30%-80%的地图.我的观点是发现高度图中的边缘并标记这些边缘以供进一步使用.
制作一个掩码 – 一个平行的2-dim字节数组.未经检查的区域字节为0,对于洪水区域的新边界,它将具有值1.对于洪水区域的内部 – 值2.并且还保留当前边界点的列表.在外循环的任何一端,您都有具有标记的当前边界,内部和外部区域以及边界点阵列的蒙版.因此,您将仅在边框上检查新点.在检查边界点的第一个arraylist时,您正在创建第二个边框arraylist和第二个mask.在下一步中,您将重新创建第一个边框数组和蒙版.通过这种方式,我们可以使用简单的while循环而不是递归,因为您在任何步骤检查的数据结构都非常简单.
顺便说一句,你忘记检查新点的坐标是否在绘制的边界上或整个矩形的边界上.
至于在所有相邻点骑行,请查看我的算法here