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

时间:2012-10-01 21:12:26

标签: c++ algorithm game-engine

如何在地图上查找所有森林群? 我有简单的类单元格(类型是枚举{RIVER,FOREST,GRASS,HILL}

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

并映射为vector<Cell> grid。任何人都可以建议我创建list<list<Cell>> clusters算法,其中列表包含相同群集中的FOREST单元格(群集是连接的单元格集合 - 连接可以在八个方向:向上,向下,向左,向右,向上 - 向上,向上 - 向下,向下 - 向下,向下 - 向右)?我需要在地图上找到所有森林群集,并将每个群集放在list<Cell>

2 个答案:

答案 0 :(得分:1)

算法相当简单,实际上甚至不依赖于群集的确切定义。假设您有一个谓词cluster(f0, f1),如果truef0位于同一群集中,则谓词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