实施Flood Fill算法的变体。

时间:2011-07-28 13:51:52

标签: c# algorithm xna

我正在尝试使用flood fill算法查找列表中所有相似的相邻对象,以将其标记为删除。我试图在维基百科上修改伪代码,但是已经卡住了。

列表中的每个对象都有一个int X值,一个int Y值,一个Name和一个标记为删除的bool。我希望在名字上匹配。

程序在没有try-catch的情况下挂起,只是退出它。它不会返回错误消息。这是我到目前为止所做的,试图在上面找到任何对象。

    //Find neighbouring bubbles
    gameGrid.DetectNeighbours2(gameGrid.planets.Last(), gameGrid.planets.Last().name);


    //Flood fill algorithm to detect all connected planets
        internal void DetectNeighbours(Planet p, Planet.Name planetName)
        {
            try
            {
                if (p.planet != planetName)
                    return;

                p.deletable = true;

                DetectNeighbours(GetTopNode(p), planetName);
            }

            catch (Exception err)
            {
                Debug.WriteLine(err.Message);
            }
        }


        internal Planet GetTopNode(Planet b)
        {
            foreach (Planet gridPlanet in planets)
            {
                if (gridPlanet .Y == b.Y - 50)
                    return gridPlanet ;       
            }

            return b; //Don't think this is right, but couldn't think of alternative
        }

2 个答案:

答案 0 :(得分:1)

首先,您应该将此字符串修改为:

if (p.planet != planetName || p.deletable)
    return;

所以你不要一次又一次地访问同一个星球。

它至少应该缓解挂起(实际上是无限递归)。

但无论如何,这个算法不应该工作,因为你只减少y值,但是你想尝试向所有方向移动。

答案 1 :(得分:1)

或者你可以像这样重写它。

gameGrid.DetectNeighbours2(gameGrid.planets.Last());


//Flood fill algorithm to detect all connected planets
    internal void DetectNeighbours(Planet p)
    {
        try
        {
            if (p == null || p.deletable)
                return;

            p.deletable = true;

            DetectNeighbours(GetTopNode(p));
        }

        catch (Exception err)
        {
            Debug.WriteLine(err.Message);
        }
    }


    internal Planet GetTopNode(Planet b)
    {
        foreach (Planet gridPlanet in planets)
        {
            if (gridPlanet .Y == b.Y - 50)
                return gridPlanet ;       
        }

        return null;
    }