哪个算法可以用于生成具有多个成功路径的迷宫,并且如果算法是某个众所周知的算法的修改版本,则解释或添加链接。
我正在使用2D阵列A来存储迷宫的配置。
假设迷宫的大小是否为n * n,那么从A [0] [0]到A [n-1] [n-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
,您可以判断它是否有多条路径。