【问题标题】:Recursive maze generation递归迷宫生成
【发布时间】:2014-01-12 18:46:55
【问题描述】:

我不小心在我的另一个帐户上发布了这个问题,所以我删除了帖子并重新发布到这个帐户上。

所以我想创建一个有趣的迷宫生成算法,但我遇到了一点问题。我编写的算法放入了无法到达且没有出口的空间。可能是什么问题?

这就是我的意思

# # # # # # # # # # # # # # # # # # # # # 
# . . . . . # . # . . . # . # . # . . . # 
# . # # # . # . # # # . # # # . # # # # # 
# . . . # . # . # . . . . . # . . . . . # 
# # # . # . # . # # # # # . # # # . # # # 
# . . . # . # . . . . . # . # . # . # . # 
# . # # # . # # # # # . # # # . # . # . # 
# . # . # . . . . . # . . . . . . . # . # 
# . # . # . # # # # # # # . # # # . # # # 
# . # . # . . . . . . . # . . . # . # . # 
# . # . # # # # # # # . # . # . # # # . # 
# . # . # . . . . . . . # . # . # . . . # 
# # # # # . # # # # # # # . # . # . # # # 
# . # . . . # . . . . . . . # . # . # . # 
# . # # # . # . # # # # # # # # # . # # # 
# . . . # . . . # . # . . . . . . . # . # 
# # # . # # # . # # # # # # # . # # # . # 
# . # . # . . . . . # . . . # . . . . . # 
# # # . # . # # # . # . # # # . # # # . # 
# . # . . . # . # . # . # . . . . . # . # 
# # # # # # # # # # # # # # # # # # # # # 

这是我的代码
说明:
创建一个由完全连接的单元组成的迷宫。如前所述 0 up, 1 down, 2 right, 3 left, orientTo 记录 dfs 是否向上/向下/向左/向右到达当前单元格。 在 mazeGen 函数中:生成你来自的单元格,现在移除当前单元格和最后一个单元格之间的墙。生成当前单元格的所有邻居并将它们随机排列到一个数组中,数组保存 x,y,以及 dfs 移动到该邻居单元格的方式。现在遍历这个数组并使用这些邻居值递归调用 dfs。

【问题讨论】:

  • 你为什么有多个账户?
  • 删除后,您失去了我的评论。我再说一遍:我还没有检查还有什么问题,但是您的“随机排列”可能会将同一个邻居放入多个插槽中,我怀疑这就是您的意图。随机播放。
  • 这是一个意外,我在programmers.stackexchange上按了用facebook登录,创建了一个全新的帐户,然后帖子被迁移到这里。所以我只是删除它并重新发布。
  • 还有keshlam,真的吗?我问这个是因为 if(points[j][0]..... 行确保它没有,因为它检查条目是否已经添加到另一个位置。
  • ...好吧,你可能是对的。这是做你想做的事的一种由内而外的方式,但是......

标签: java algorithm recursion


【解决方案1】:

我认为迷宫空间(非墙壁)应该是一棵树。这意味着,所有空间都连接在一起,并且每对空间之间只有一条路径。

由于树没有循环,因此可以通过打破找到的任何循环来创建迷宫。可以通过查找循环 (DFS) 并将检测到的循环中的任何空间设置为墙来完成,直到没有循环。它可以在一个 DFS 通道中完成。不同迷宫的创建是通过选择不同的起始空间并随机选择邻居进行。

【讨论】:

  • 所以基本上洪水填满了所有的空间,如果有些部分没有被淹没,你选择一个随机的墙单元,然后打破它?
  • 是的,随机填充填充空间,如果填充发现已经被淹没的单元格,则在单元格上设置一堵墙,从那里开始填充被淹没的单元格。
  • 对于迷宫生成算法来说,这似乎比它应该做的工作要多得多,难道没有办法将这种逻辑合并到 dfs 中吗?就像这样,它永远不会创建封闭的空间。
  • 维基有很好的描述和很好的video
  • 是的,我明白了,我只是改变了代码的顺序,并删除了记录最后访问单元格的参数。现在它会生成下一个单元格。
猜你喜欢
  • 1970-01-01
  • 2020-12-14
  • 2020-05-05
  • 1970-01-01
  • 2018-09-08
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多