使用深度优先搜索算法解决迷宫

时间:2016-05-03 13:54:39

标签: algorithm search graph depth-first-search maze

所以我有这个学校项目: 我作为输入给了一个迷宫,我必须解决它。我想过使用DFS算法来做到这一点。

到目前为止我所做的是将我的迷宫变成一个图形,其中顶点是迷宫的非墙壁位置。

我在网上找到了DFS的伪代码。我实现了它,但我不明白我应该如何从中获得一条路径。算法的伪代码是:

   dfs(graph G,vertex a)
   {
      ColorNode(a);
      for all vertices e adjacent to a
      {
        if e is endpoint
         END
        if e is not colored
         dfs(G, e)
      }  
    }

使用此算法,所有节点最终都会被着色。 如果有人能帮我一把,那真的很棒!

3 个答案:

答案 0 :(得分:3)

路径由堆栈跟踪中的节点组成。您可以修改dfs以返回bool,如果它找到了结尾,并且当它返回true时,您将打印或添加到列表顶点a(请注意,这会向后提供路径)。

或者有一个堆栈(全局,或在函数中传递对它的引用)。当你调用dfs push vertex a到它并在你回来时弹出它。然后,当您到达端点时,堆栈包含路径。

除非END停止整个程序,否则所有可到达的节点都应该变为彩色。我怀疑你写了它,以便你在找到目的地之后继续前进,这样你的程序就会保持着色节点。没有很好的方法可以结束递归(你可以抛出异常,但这只是一种不好的风格)所以你需要让调用者知道找到了解决方案并停止尝试其他事情(你可以如果找到解决方案,则返回bool,因此当调用返回true时,您可以立即返回true)。

答案 1 :(得分:1)

如果所有节点最终都是彩色的,那么在图形构造或迷宫设计中肯定会出现一些错误,因为使用此代码迟早会找到退出。

关于找回路径,您可以这样做:当您打开一个新节点时,向该节点传递对您来自的节点的引用,并将其存储在节点内:当您到达端点时,只需返回以下你存储的指针,你可以重建带你到那里的路径。

答案 2 :(得分:0)

这些问题"我该如何做DFS?"问题是对实际情况的理解很少。

一旦你问自己我怎么去迷宫才能找到它?它是(好吧......应该)或多或少直截了当,该做什么:

你会把一个线程打到你的起始位置,然后按照这些简单的规则开始思考:

  1. 每当你到达一个路口时,你会检查是否还有某个你还没有去过的地方,如果有的话,那么你只需按照这个方向前进

  2. 如果您到达一个不再可能继续前进的交叉路口,您可以通过穿过迷宫地板上的两个分支将该位置标记为已访问。下次您将跳过此联结,并且从您来自的地方返回

  3. 就您的代码片段而言:

        dfs(graph G,vertex a)//What should I do at this junction?
       {
          ColorNode(a);//Stretch your thread to that junction
          for all vertices e adjacent to a//Choose a direction you haven't visited yet
          {
            if e is endpoint//If I found the exit of the maze
             END//I survived
            if e is not colored//If I haven't been in this direction earlier
             dfs(G, e)//Let's move on to that direction
          }  
        }