所以我有这个学校项目: 我作为输入给了一个迷宫,我必须解决它。我想过使用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)
}
}
使用此算法,所有节点最终都会被着色。 如果有人能帮我一把,那真的很棒!
答案 0 :(得分:3)
路径由堆栈跟踪中的节点组成。您可以修改dfs以返回bool,如果它找到了结尾,并且当它返回true时,您将打印或添加到列表顶点a
(请注意,这会向后提供路径)。
或者有一个堆栈(全局,或在函数中传递对它的引用)。当你调用dfs push vertex a到它并在你回来时弹出它。然后,当您到达端点时,堆栈包含路径。
除非END停止整个程序,否则所有可到达的节点都应该变为彩色。我怀疑你写了它,以便你在找到目的地之后继续前进,这样你的程序就会保持着色节点。没有很好的方法可以结束递归(你可以抛出异常,但这只是一种不好的风格)所以你需要让调用者知道找到了解决方案并停止尝试其他事情(你可以如果找到解决方案,则返回bool,因此当调用返回true时,您可以立即返回true)。
答案 1 :(得分:1)
如果所有节点最终都是彩色的,那么在图形构造或迷宫设计中肯定会出现一些错误,因为使用此代码迟早会找到退出。
关于找回路径,您可以这样做:当您打开一个新节点时,向该节点传递对您来自的节点的引用,并将其存储在节点内:当您到达端点时,只需返回以下你存储的指针,你可以重建带你到那里的路径。
答案 2 :(得分:0)
这些问题"我该如何做DFS?"问题是对实际情况的理解很少。
一旦你问自己我怎么去迷宫才能找到它?它是(好吧......应该)或多或少直截了当,该做什么:
你会把一个线程打到你的起始位置,然后按照这些简单的规则开始思考:
每当你到达一个路口时,你会检查是否还有某个你还没有去过的地方,如果有的话,那么你只需按照这个方向前进
如果您到达一个不再可能继续前进的交叉路口,您可以通过穿过迷宫地板上的两个分支将该位置标记为已访问。下次您将跳过此联结,并且从您来自的地方返回。
就您的代码片段而言:
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
}
}