【问题标题】:maze problem and Recursive backtracker algorithm迷宫问题和递归回溯算法
【发布时间】:2023-04-15 09:02:01
【问题描述】:

我想实现递归回溯算法来解决迷宫问题,但我无法理解 2.3 命令(“移除当前单元格和所选单元格之间的墙”)对我有帮助吗?

  1. 将当前单元格标记为“已访问”
  2. 如果当前单元格有没有被访问过的邻居
    1. 随机选择未访问的邻居之一
    2. 将当前单元格添加到堆栈中
    3. 移除当前单元格和所选单元格之间的墙
    4. 将所选单元格设为当前单元格
    5. 递归调用此函数
  3. 其他
    1. 从堆栈中移除最后一个当前单元
    2. 回溯到该函数的上一次执行

编辑 其实我想要一个算法来用栈来解决迷宫问题。

【问题讨论】:

  • 你从哪里得到这个算法的?想必这是解决“现实世界”式迷宫的尝试吧!移除一堵墙会改变迷宫,因此使“迷宫解决”算法有些无用。也没有其他“把墙放回去”的指令。
  • 啊所以这是一个迷宫生成算法而不是迷宫求解器。我从您的问题中得到的印象是,这是解决现有迷宫的尝试。
  • 我真的想找到通往目的地的最佳方式。你认为这是一个合适的算法吗?
  • dev - 你需要一个迷宫求解算法,例如en.wikipedia.org/wiki/Maze_solving_algorithm

标签: algorithm maze


【解决方案1】:

那个算法是一个迷宫生成器而不是一个迷宫求解器。这个想法是你想创建一个随机迷宫。您还希望迷宫中的所有点都可以从所有其他点到达。

如果您只是随机移除墙壁,您的迷宫很可能无法连接。递归回溯算法通过创建随机 walk 并沿着该随机游走移除墙壁来解决此问题。递归回溯部分可以让你走到迷宫中的每个单元格,即使你走到了死胡同。

【讨论】:

  • 我觉得我走错路了。我想通过堆栈解决迷宫,然后找到最好的方法和可能的方法。
  • +1 意识到这是一代没有解决!也让我大吃一惊。可以重新命名/改写问题。
  • @persian dev - 你需要一个迷宫求解算法,例如en.wikipedia.org/wiki/Maze_solving_algorithm
  • 在这种情况下,只需将迷宫视为图形,然后进行 DFS(堆栈)或 BFS(队列)。
【解决方案2】:

您的算法适用于god 模式。通常你应该这样做

  1. 如果当前单元格是出口,则结束
  2. 如果当前单元格有任何未被访问过的邻居不是墙
    1. 随机选择一个未访问过的non-wall邻居
    2. 将当前单元格添加到堆栈中
    3. 什么都没有
    4. 将选中的单元格设为当前单元格
    5. 递归调用该函数
  3. 其他
    1. 从堆栈中移除最后一个当前单元
    2. 回溯到该函数的上一次执行

【讨论】:

  • 我将 0 用于非壁单元,将 1 用于壁单元,如下面的数组:{0,0,0} {0,0,1} ....
  • 这个算法不是神模式,是迷宫生成。上帝模式不需要任何随机化(实际上您的搜索算法也不需要)。
  • “壁细胞”是什么意思?每个单元格将有 4 面墙,尽管它们都将与其他单元格共享(边缘除外)。如果您愿意,我会说您需要记录顶部和右侧的细胞壁(或北部和东部)。这些将分别是顶部和右侧两个单元的底部和左侧(或南和西)墙。
  • @El Ronnoco:意思是把整个细胞当成一堵墙。
  • @ruslik。啊,我明白了。因此,每个轴上的每个其他单元格都是一个“房间”。有道理。
【解决方案3】:

拆墙就是拆墙!你从一个网格开始,每个网格都被 4 面墙完全包围。当你随机移动 (2.1) 时,你会移除连接单元的墙。

【讨论】: