如何在地图上找到所有森林群

How to find all clusters of forest on map?

本文关键字:森林 地图      更新时间:2023-10-16

如何在地图上找到所有森林群?我有简单的类单元格,例如(类型是枚举{河流,森林,草,丘陵}

class Cell{
   public:
     Type type;
     int x;
     int y
};

并像vector<Cell> grid一样映射.谁能建议我创建list<list<Cell>> clusters的算法,其中列表包含同一集群中的 FOREST 单元格(集群是一组连接的单元格 - 连接可以是八个方向:上、下、左、右、up_right、up_left、down_left、down_right)?我需要在地图上找到所有森林集群,并将每个集群放在list<Cell>中。

该算法相当简单,实际上甚至不依赖于集群的确切定义。假设您有一个谓词cluster(f0, f1)如果f0f1位于同一集群中,则会产生true。您需要做的就是穿过grid并找到一片森林。如果单元格f是林,则检查是否cluster(f, other)每个已知林。如果cluster(f, other)产生truef添加到other簇中。你继续检查其他簇中的其他已知森林:当你在另一个簇中找到另一个c cluster(f, c)也产生true,你合并(std::list<Cell>::spice())两个簇。

我把它作为评论,但也可以回答:

查找联合查找算法。使用路径压缩,您可以只 之后遍历结构并为每个根创建一个列表, 随时将单元格添加到相应的列表中。

链接: http://en.wikipedia.org/wiki/Disjoint-set_data_structure

对于所有单元格,与上方和左侧的单元格执行并集。 如果您希望对角线连接,则还包括左上角和右上角对角线)。

使用联合查找的路径压缩版本,以便群集中的所有节点都指向单个根。 然后,您所要做的就是遍历您的结构(在完成所有联合之后)并随时添加节点。 伪(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