遍历迷宫的算法

时间:2013-05-16 02:27:15

标签: algorithm

我需要一些帮助来编写一套if-then规则来遍历迷宫。这就是问题所在:

“假设迷宫是在方格单元网格上构建的,方法是将墙壁放置在单元格的某些边缘上,使得从迷宫内的任何单元格到迷宫的外边缘都有一条路径。没有墙。

一种方法是左手规则,但这种策略可以带你到周期。

用英语编写if-then规则,用于遍历墙并检测循环。假设你知道网格的大小和你可能要逃离迷宫的最大距离。“

这是我到目前为止所做的:

  1. 开始

  2. 如果只找到一条路径(左或右或直路),请按照路径行进。

  3. 否则如果找到多个路径:

    如果找到左路,请左转。

    否则,如果找到直线路径,请沿直线路径行驶。

    否则,如果找到正确的路径,请右转。

  4. 否则如果找到死角,请转“U”。

    转到第2步

  5. 结束

  6. 但这不是解决循环问题。有人可以帮忙吗?

1 个答案:

答案 0 :(得分:3)

这是探索图形的两种通用算法:广度优先搜索(BFS)和深度优先搜索(DFS)。这些算法的技巧是它们从未探索列表中的所有路径开始,并且当它们访问路径时,它们将这些路径添加到探索列表中。当您访问每个节点时,您将其从未探索列表中删除,因此您不会再次访问它。通过在每种情况下仅从未探索的列表中提取节点,您没有自己的双重情况。

以下是DFS的示例,其中包含用于防止循环和BFS的检查:

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