实现洪水填充算法的一种变体
本文关键字:一种 填充 算法 实现 | 更新日期: 2023-09-27 18:03:43
我试图使用洪水填充算法在列表中找到所有类似的相邻对象,将它们标记为删除。我试过改编维基百科上的伪代码,但是卡住了。
列表中的每个对象都有一个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
}
或者你可以这样重写。
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;
}
首先,您应该将这个字符串修改为:
if (p.planet != planetName || p.deletable)
return;
这样你就不会一次又一次地访问同一个星球了。
它至少应该减轻挂起(实际上是无限递归)。
但无论如何,这个算法不应该工作,因为你只减少y
值,但你想尝试在所有方向上移动