如何在地图上找到所有森林群
How to find all clusters of forest on map?
如何在地图上找到所有森林群?我有简单的类单元格,例如(类型是枚举{河流,森林,草,丘陵}
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)
如果f0
和f1
位于同一集群中,则会产生true
。您需要做的就是穿过grid
并找到一片森林。如果单元格f
是林,则检查是否cluster(f, other)
每个已知林。如果cluster(f, other)
产生true
则f
添加到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
。
- 为什么不;名字在地图上是按顺序排列的吗
- 基于多个条件处理地图中的所有元素
- 在C++中将矢量转换为嵌套地图
- 替换基于地图的所有引用
- 如何区分地图中的 0 和 false?
- 地图计数确实很重要,或者只是检查是否存在
- 如何从地图中删除矢量对象
- 是否有任何C++功能可以对地图进行排序?
- 如何使用 std::variant 打印地图键/值?
- 从矢量或地图中删除共享指针
- 在 c++ 中,有一种方法可以创建一个包含地图作为值的树状地图?
- 无限嵌套具有变体的地图
- C++一会儿循环读到地图上 2 行?
- 如何在cpp中使用地图显示给定日期范围内(在下面的问题中)的费率?
- 如何检查变量是否是C++中的地图?
- 如何使地图按值C++排序
- 修改地图内矢量中的值
- 为什么我在地图中搜索STL时差很大?
- 我正在尝试按降序对地图进行排序,但没有得到预期的结果?
- 如何在地图上找到所有森林群