【问题标题】:Generating obstacles on NxM board在 NxM 板上生成障碍物
【发布时间】:2020-01-02 16:11:16
【问题描述】:

我有 NxM 板。我想为其添加 K 个障碍,但在某种程度上,仍然可以从每个空白空间到达每个其他空白空间。我希望它看起来像这样

蓝色方块是障碍物。

换句话说,我有一个图形网格,我想从中随机删除 K 个顶点而不断开它。

我知道我可以通过从一个节点执行 dfs 并删除最远的顶点来做到这一点,但它不会真的是随机的,它看起来不太好,也不是我想要的。

是否有可以做我想做的事情的算法,或者有没有人有一些想法可以测试?

编辑:典型的迷宫生成算法不适用于我的情况,因为据我了解,它们通过从图中删除边来工作,在这里我需要删除整个顶点

【问题讨论】:

  • 这能回答你的问题吗? What's a good algorithm to generate a maze?
  • @fafl 不幸的是不是,因为这些算法通过从图中删除边来工作,在我的情况下,我想删除整个顶点。
  • K 有什么限制?
  • @Raj 无,除了它小于 NM。但是,如果它有助于解决问题,它可能会限制在 NM/2
  • 似乎你需要三个规则:1)每个蓝色区域形成一棵树,即没有循环,2)一个蓝色区域的节点不能与另一个蓝色区域相邻,甚至对角线,3)每个蓝色区域只能在棋盘边缘有一个节点。一般来说,这意味着 K 必须远小于 MxN。

标签: algorithm graph-algorithm maze procedural-generation


【解决方案1】:

您可以使用不相交的集合数据结构来做到这一点:https://en.wikipedia.org/wiki/Disjoint-set_data_structure

  • 每个顶点都分配给一个集合,用于标识它属于哪个“边界”
  • 最初,外边界上的顶点都在同一个集合中,每个内部顶点都在自己的集合中。
  • 随机选择一个“有效”的方格并填充它。相应地合并其 4 个角中每个角的边界集。
  • 重复直到选择了 K 个方格

如果填充一个正方形会创建一个边界循环,则它是“无效的”:

  • 任何具有 3 个已填充邻居的未填充正方形都是有效的。否则...
  • 对于每个未填充的邻居,如果其相邻的角在同一边界内,则填充正方形会创建一个循环,因此无效。
  • 如果任一对角在同一边界,但其他角都不在同一边界,则填充正方形会产生循环,因此无效。

为了有效地实现,请以伪随机顺序随机尝试所有正方形。由于填充一个正方形可能会使以前无效的正方形有效,但是,每当您填充一个正方形时,请将其先前排除的邻居添加回可能性池中。

【讨论】:

  • 这似乎可行。但是,如果我理解正确,in this case,黄色方块将被视为无效,因为上面白色方块的两个角在同一个集合中。如何处理?
  • 好收获。我为此添加了一个特殊情况。稍后我将检查所有案例以确保它们都能正常工作。
猜你喜欢
  • 1970-01-01
  • 2020-03-22
  • 2015-07-22
  • 2011-08-25
  • 2022-07-22
  • 1970-01-01
  • 2013-12-08
  • 2022-01-24
  • 1970-01-01
相关资源
最近更新 更多