Реализация варианта алгоритма Flood Fill. - PullRequest
2 голосов
/ 28 июля 2011

Я пытаюсь использовать алгоритм flood fill , чтобы найти все похожие смежные объекты в списке, чтобы пометить их для удаления. Я пытался адаптировать псевдокод в Википедии, но застрял.

Каждый объект в списке имеет значение int X, значение int Y, имя и логическое значение для пометки для удаления. Я хочу сопоставить имя.

Программа зависает без 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 ]

1 голос
/ 28 июля 2011

Или вы можете переписать это так.

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;
    }
1 голос
/ 28 июля 2011

Во-первых, вы должны изменить эту строку следующим образом:

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

чтобы вы не посещали одну и ту же планету снова и снова.

Это должно как минимум облегчить зависания (на самом деле бесконечная рекурсия).

Но в любом случае этот алгоритм не должен работать, поскольку вы только уменьшаете значение y, но вы хотите попытаться двигаться во всех направлениях.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...