如何在地图上查找所有森林群? 我有简单的类单元格(类型是枚举{RIVER,FOREST,GRASS,HILL}
class Cell{
public:
Type type;
int x;
int y
};
并映射为vector<Cell> grid
。任何人都可以建议我创建list<list<Cell>> clusters
算法,其中列表包含相同群集中的FOREST单元格(群集是连接的单元格集合 - 连接可以在八个方向:向上,向下,向左,向右,向上 - 向上,向上 - 向下,向下 - 向下,向下 - 向右)?我需要在地图上找到所有森林群集,并将每个群集放在list<Cell>
。
答案 0 :(得分:1)
算法相当简单,实际上甚至不依赖于群集的确切定义。假设您有一个谓词cluster(f0, f1)
,如果true
和f0
位于同一群集中,则谓词f1
。您需要做的就是运行grid
并找到一个森林。如果单元格f
是林,则检查每个已知林的cluster(f, other)
是否为cluster(f, other)
。如果true
产生f
,则会将other
添加到c
的群集中。您继续检查其他群集中的其他已知林:当您在cluster(f, c)
的另一个群集中找到另一个小区true
时,还会生成std::list<Cell>::spice()
,您合并({{1}})这两个群集
答案 1 :(得分:1)
我把它作为评论,但也可以回答:
查找union-find算法。使用路径压缩,你可以 然后遍历结构并为每个根创建一个列表, 将您的单元格添加到适当的列表中。
链接:http://en.wikipedia.org/wiki/Disjoint-set_data_structure
对于所有细胞,与上方和左侧的细胞进行联合。如果你想要对角线连接,那么还要包括左上角和右上角。)
使用union-find的路径压缩版本,以便群集中的所有节点都指向单个根。然后,您所要做的就是遍历您的结构(完成所有工会之后)并随时添加节点。伪(ISH)代码:
foreach node
Find(node) // this ensures path compression
if not clusters.hasList(node.root)
clusters.createList(node.root)
end
list <- clusters.getList(node.root)
list.append(node)
end
以上假设如果某个节点是根,则node.root
指向node
。