vlambda博客
学习文章列表

走迷宫之深度优先搜索(二)

续前文。

现在我们多了一个实际需求,输出所有走法,以及最短路径。


这里提供一种思路

创建一个一维结构体数组,每走一步,将该位置的坐标放入数组,返回时将该坐标从数组中去掉,最后到达正确位置的时候,将数组中元素打印出来。

下图是一维结构体数组s,因为它是静态的,所以还需要一个变量end来指示下一次放入数组的位置,找到一种走法的时候,end还可以作为循环遍历的结束条件。

 


走完四个方向的代码就成了下图:

 

走迷宫之深度优先搜索(二)


递归的结束条件就成了:

 

走迷宫之深度优先搜索(二)


将添加了功能的代码运行一下,给出一个54列的迷宫,并输入地图,将所有从起点到终点的走法都输出。

 

走迷宫之深度优先搜索(二)


看结果可知,输出了所有的走法,有的走法用了9步,有的用了7步,最后输出最少步数,7



换一个55列的迷宫,所有的走法和最短路径如下图。共有4种走法,其中最短的用了8步。 


重复一遍,深度优先搜索就是遍历所有的方法的算法。至于全部找到后要干什么,那就根据需要添加数据结构和代码。


1970年,既是同事又是同学的算法设计科学家约翰·E·霍普克洛夫特(John E. Hopcroft)和罗伯特·陶尔扬(Robert E Tarjan)在斯坦福大学研究图的连通性(图中任意两点是否都是相连的)和平面性(图中所有的边都要互不交叉)问题(这些问题在当时具有很高的应用价值,比如印刷电路板的设计)时,提出一种新的对图进行搜索的思路,比起普通的遍历算法,深度优先搜索算法是线性的,当问题规模扩大一倍,运行花费的时间也才提高一倍。1986年,二人因为深度优先搜索获得了图灵奖。直到今天,深度优先搜索仍然在信息检索,人工智能方面发挥着重要的作用。