哪种算法可以用于生成具有多个成功路径的迷宫,并且如果算法是一些众所周知的算法的修改版本,则解释或添加链接。
我正在使用2D数组A来存储迷宫的配置。
假设迷宫的大小是n * n那么从A [0] [0]到A [n-1] [n-1]应该有多条路径。
答案 0 :(得分:3)
此算法应该能够生成具有从开始到目标的不同无循环路径的迷宫:
从一个空的迷宫(或一块坚固的岩石)开始,只有开始和目标...
或者,如果您已经有一个单一路径形式的迷宫开始目标,请使用此变体:
生成的路径可能具有(可能甚至是实质性的)部分,但它们应该是从开始到目标的唯一无循环路径。以下是第一个案例的说明:
答案 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
,你可以判断它是否有多条路径。