如何生成一个包含多个成功路径的迷宫?

时间:2014-03-10 16:21:54

标签: algorithm graph-algorithm maze

哪种算法可以用于生成具有多个成功路径的迷宫,并且如果算法是一些众所周知的算法的修改版本,则解释或添加链接。

我正在使用2D数组A来存储迷宫的配置。

假设迷宫的大小是n * n那么从A [0] [0]到A [n-1] [n-1]应该有多条路径。

2 个答案:

答案 0 :(得分:3)

此算法应该能够生成具有从开始到目标的不同无循环路径的迷宫:

从一个空的迷宫(或一块坚固的岩石)开始,只有开始和目标...

  1. 将迷宫细分为三组:开始(最初仅持有开始单元格),目标(最初只持有目标单元格),未发现< / em>(所有其余的)。
  2. 随机删除 start 目标集中的单元格与未发现的集中的单元格之间的墙,并将新发现的单元格移动到各自的一套。
  3. 重复,直到每个单元格都在 start 目标集中。
  4. 在两个区域之间移除尽可能多的墙,因为您需要从开始到目标的路径。
  5. 或者,如果您已经有一个单一路径形式的迷宫开始目标,请使用此变体:

    1. 从开始和目标开始进行广度优先搜索,并为迷宫中的每个单元格记录单元格远离开始和目标的步数。
    2. 通过将距离开头较近的所有单元格放入 start 集合并将更接近目标的所有单元格放入目标集合来细分迷宫。
    3. 删除两个区域之间的墙,以添加从开始到目标的其他路径。
    4. 生成的路径可能具有(可能甚至是实质性的)部分,但它们应该是从开始到目标的唯一无循环路径。以下是第一个案例的说明:

      enter image description here

答案 1 :(得分:1)

假设您正在使用BFS解决您的迷宫:

Q.push(initial_position)
visited[initial_position] = true
while !Q.empty
    cur = Q.top
    for n in cur.neighbors
        if (visited[n])
            continue;
        Q.push(n)
        from[n] = cur
        visited[n] = true

使用visited,您确保不要两次访问节点。使用from,您可以记住如何到达该节点。

因此,让我们更改visited以包含更多信息:

Q.push(initial_position)
visited[initial_position] = 1
while !Q.empty
    cur = Q.top
    for n in cur.neighbors
        ++visited[n]
        if (visited[n] > 1)
            continue;
        Q.push(n)
        from[n] = cur

现在visited不仅会说明该节点是否被访问过,而且还说明了访问过多少次。请注意,它仍然没有说明它有多少路径,而只是它是否有多条路径。

但是,通过查看goal仍然难以检测到多个解决方案。想想以下迷宫:

   #######
-->       -->
   # ### #
   # ### #
   #     #
   #######

这就是visited的样子:

   #######
-->1111111-->
   #1###1#
   #1###1#
   #11112#
   #######

所以我们可以做的是做另一个BFS,但这次是n visited[n] > 1和更新visited

Q.push(initial_position)
visited[initial_position] = 1
while !Q.empty
    cur = Q.top
    for n in cur.neighbors
        ++visited[n]
        if (visited[n] > 1)
            if (!visited2[n])
                Q2.push(n)
                visited2[n] = true
            continue;
        Q.push(n)
        from[n] = cur

while !Q2.empty
    cur = Q2.top
    for n in cur.neighbors
        visited[n] = max(visited[n], visited[cur])
        if (visited2[n])
            continue;
        Q.push(n)
        visited2[n] = true

现在visited对于上述迷宫变为:

   #######
-->2222222-->
   #2###2#
   #2###2#
   #22222#
   #######

所以在这一点上,通过查看goal,你可以判断它是否有多条路径。