Algorithm 穿越迷宫的算法
我需要一些帮助来编写一套穿越迷宫的if-then规则。这就是问题所在: “假设迷宫是在正方形单元网格上构建的,通过在单元的某些边缘上放置墙,使迷宫中的任何单元都有一条路径通向没有墙的迷宫外缘 一种方法是左手法则,但这种策略可以让你循环往复 用英语写下穿越墙壁和探测循环的规则。假设你知道网格的大小和逃离迷宫所需的最大距离。” 这就是我到目前为止所做的:Algorithm 穿越迷宫的算法,algorithm,Algorithm,我需要一些帮助来编写一套穿越迷宫的if-then规则。这就是问题所在: “假设迷宫是在正方形单元网格上构建的,通过在单元的某些边缘上放置墙,使迷宫中的任何单元都有一条路径通向没有墙的迷宫外缘 一种方法是左手法则,但这种策略可以让你循环往复 用英语写下穿越墙壁和探测循环的规则。假设你知道网格的大小和逃离迷宫所需的最大距离。” 这就是我到目前为止所做的: 开始 如果只找到一条路径(左、右或直),请按照该路径进行操作 否则,如果找到多个路径: 如果找到左边的路,左转 否则,如果找到直线路径,则遵循直线
但这并不能解决周期问题。有人能帮忙吗?有两种通用的图形搜索算法:广度优先搜索(BFS)和深度优先搜索(DFS)。这些算法的诀窍在于,它们从未探索列表中的所有路径开始,当它们访问路径时,会将这些路径添加到探索列表中。当您访问每个节点时,您会将其从未探索列表中删除,这样您就不会重新访问它。在每种情况下,只要从未探索的列表中提取节点,就不会出现重复出现的情况 以下是带有检查以防止循环和BFS的DFS示例:
function DFS(G,v):
label v as explored
for all edges e in G.adjacentEdges(v) do
if edge e is unexplored then
w ← G.adjacentVertex(v,e)
if vertex w is unexplored then
label e as a discovery edge
recursively call DFS(G,w)
else
label e as a back edge
现在,BFS:
procedure BFS(G,v):
create a queue Q
enqueue v onto Q
mark v
while Q is not empty:
t ← Q.dequeue()
if t is what we are looking for:
return t
for all edges e in G.adjacentEdges(t) do
u ← G.adjacentVertex(t,e)
if u is not marked:
mark u
enqueue u onto Q
return none
通常要记住你去过的地方。除非你不被允许这样做(那么可能吗)?如果你从一个矩形、平面、迷宫的边缘开始,并且出口/目标也在边缘上,那么右手或左手法则最终会让你到达那里。如果你的出发点是在这样一个迷宫里,那么你需要检测循环的能力;此时您将切换到另一面墙。在某些退化的情况下,仍然有可能最终遍历拓扑上相当于图8(lemniscate)的形状。这意味着有多个有效的解决方案路径。从这里开始,你需要一种方法来多次切换墙壁(通过路径跟踪)。记住任何相邻的一对步骤,并在没有立即穿过第二个步骤的情况下检测是否遇到了较旧的步骤,这将检测到一个循环(最终,尽管不一定有效)。感谢您的解释,这将使它更加清晰!也许在这里也提到“回溯”,这样谷歌就会找到你。(:谢谢!我现在对此有了更好的理解!