Algorithm 穿越迷宫的算法

Algorithm 穿越迷宫的算法,algorithm,Algorithm,我需要一些帮助来编写一套穿越迷宫的if-then规则。这就是问题所在: “假设迷宫是在正方形单元网格上构建的,通过在单元的某些边缘上放置墙,使迷宫中的任何单元都有一条路径通向没有墙的迷宫外缘 一种方法是左手法则,但这种策略可以让你循环往复 用英语写下穿越墙壁和探测循环的规则。假设你知道网格的大小和逃离迷宫所需的最大距离。” 这就是我到目前为止所做的: 开始 如果只找到一条路径(左、右或直),请按照该路径进行操作 否则,如果找到多个路径: 如果找到左边的路,左转 否则,如果找到直线路径,则遵循直线

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

“假设迷宫是在正方形单元网格上构建的,通过在单元的某些边缘上放置墙,使迷宫中的任何单元都有一条路径通向没有墙的迷宫外缘

一种方法是左手法则,但这种策略可以让你循环往复

用英语写下穿越墙壁和探测循环的规则。假设你知道网格的大小和逃离迷宫所需的最大距离。”

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

  • 开始

  • 如果只找到一条路径(左、右或直),请按照该路径进行操作

  • 否则,如果找到多个路径:

    如果找到左边的路,左转

    否则,如果找到直线路径,则遵循直线路径

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

  • 否则,如果发现了死胡同,就掉头

    转至步骤2

  • 结束


  • 但这并不能解决周期问题。有人能帮忙吗?

    有两种通用的图形搜索算法:广度优先搜索(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)的形状。这意味着有多个有效的解决方案路径。从这里开始,你需要一种方法来多次切换墙壁(通过路径跟踪)。记住任何相邻的一对步骤,并在没有立即穿过第二个步骤的情况下检测是否遇到了较旧的步骤,这将检测到一个循环(最终,尽管不一定有效)。感谢您的解释,这将使它更加清晰!也许在这里也提到“回溯”,这样谷歌就会找到你。(:谢谢!我现在对此有了更好的理解!