【问题标题】:Generate maze with path of specified length生成具有指定长度路径的迷宫
【发布时间】:2019-05-10 04:32:43
【问题描述】:

我的问题很简单,但很难做到。我有迷宫的大小和路径的长度。我需要找到完全指定长度的路径。然而,迷宫可以包含有效的更长路径。迷宫总是从 [0, 0] 开始并在 [size X, size Y] 结束。路径长度为 13 的 5x5 迷宫示例:(X: wall, -: path)

---XX
XX-XX
---XX
-XXXX
-----

6x6 迷宫,11 条路径长度(包含另一条大小为 15 的路径)- 有效

------
XX-XX-
---XX-
-XXXX-
-XXXX-
------

我已经尝试了很多算法,但都没有奏效。如果有人能给我一些关于我需要做什么或者我可以在哪里阅读这个问题的提示,那就太好了。

【问题讨论】:

  • 您需要一个递归算法来尝试每条路径。您移动到每个单元格尝试移动所有 4 个方向。您需要使用 Dijkstra 算法来确保您不会陷入无限循环。
  • 路径可以在其自身的另一部分旁边运行吗?例如。想象一个长度为 9 的 3x3 网格;从左上角到右下角,R R R D L L L D R R R。路径可以与自身相交吗?换句话说,一个路径单元格是否可以有超过 2 个相邻的邻居。超过 4 个(对角线,即使它不能直接到达它们)?
  • “我需要找到完全指定长度的路径。但迷宫可以包含有效的更长路径。” OP 说最短路径有具体长度,显然,自相交路径不是最短的。
  • 正如 mingaleg 所说,您的路径有更短的版本 - RRRDDD。
  • 您对有效路径的计数有什么要求吗?

标签: algorithm


【解决方案1】:

首先将逻辑作为通用概念:您从左上角开始,给单元格一个 0。 现在对于与该单元格相邻的所有有效单元格,给它一个 1。 继续前进,始终向各个方向前进,将单元格增加 1。 当你在右下角时,你有最短的路线!

现在我们需要看看方向性影响。当我们离开右下角时,我们必须再次向前迈出一步来弥补这一点。因此,最小步长为 12,每个较大的路径为 p + 2。在 15 的路径中,我们从右下角(第 5 步和第 6 步)移动 2 步,因此路径长度 = 12 + 2*2 = 16。

生成迷宫必须有点随机,但同时它应该满足路径长度的请求。如果我们想从右下角移动一个以生成路径长度,我们需要在向前的方向上至少有 1+2 次相同的移动(右下右下或右下右下)。如果我们想将 2 移开,我们需要 2+2 等等。

如果您真的想随机化,则需要使用回溯,尝试每种可能性并检查是否仍然可以完成步骤。让我们举个例子,我们需要 14 个步骤): 当我们放置 7 时,单元格 [2,3] 和 [4,3] 被阻塞。当我们放置 8 时,单元格 [2,4]、[2,5] 和 [3,5] 被阻塞。现在没有空间可以向左或向上移动,因此不可能将 8 放在 [4,4] 上。 8 可以放在 [2,4] 上。

【讨论】:

  • 我需要生成具有指定长度路径的迷宫。
  • 是的,这非常有效,如果您有 11 个所需的路径长度,您将很快完成。如果您需要 15,请忽略 11。如果您真的喜欢复杂的迷宫,则需要清空较短的路径...
  • 我没有任何墙壁,我只有迷宫的宽度、高度和路径的长度需要找到。找到路径后,我需要生成包含该路径的迷宫。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-03-24
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多