首先,您应该确保target!=replacement
(可以在初始调用“FloodFill”之前完成一次)。然后,您的算法可能会起作用,只要 _mapWidth 和 _mapHeight 不是特别大(这在很大程度上取决于您的 _mapLayers 数组的内容)。如果这是一个问题,您应该尝试使用非递归算法。创建一个
class Point
{
public int x, y;
public Point(int newX, int newY)
{
x=newX;
y=newY;
}
}
和一个
List<Point> pointList;
将初始点放入此列表并运行某种循环,直到 pointList 为空:从列表中取出一个点,像上面一样处理它,而不是上面的原始递归调用,将四个邻居再次放入列表中。
编辑:这是完整的例子,但没有测试它:
void FloodFill2(int layer, int xStart, int yStart, int target, int replacement)
{
if(target==replacement)
return;
List<Point> pointList = new List<Point>();
pointList.Add(new Point(xStart,yStart));
while(pointList.Count>0)
{
Point p = pointList[pointList.Count-1];
pointList.RemoveAt(pointList.Count-1);
if (p.x < 0) continue;
if (p.y < 0) continue;
if (p.x >= _mapWidth) continue;
if (p.y >= _mapHeight) continue;
if (_mapLayers[layer, p.x, p.y] != target) continue;
_mapLayers[layer, p.x, p.y] = replacement;
pointList.Add(new Point(p.x - 1, p.y));
pointList.Add(new Point(p.x + 1, p.y));
pointList.Add(new Point(p.x, p.y - 1));
pointList.Add(new Point(p.x, p.y + 1));
}
}
EDIT2:事实上,这里有一个优化例程的建议:如果插入变得毫无意义,请避免插入到列表中,所以:
if(p.x>=0)
pointList.Add(new Point(p.x - 1, p.y));
if(p.x<_mapWidth-1)
pointList.Add(new Point(p.x + 1, p.y));
if(p.y>=0)
pointList.Add(new Point(p.x, p.y - 1));
if(p.y<_mapHeight-1)
pointList.Add(new Point(p.x, p.y + 1));