算法在信息学奥赛中的应用(搜索法一)在这里介绍两种基本的搜索算法:深度优先搜索和广度优先搜索法,以树的搜索为例,深度优先搜索法是优先扩展尚未扩展的且具有最大深度的结点;广度优先搜索法是在扩展完第K层的结点以后才扩展K+1层的结点
深度优先搜索法与前面讲的回溯法差不多,主要的区别是回溯法在求解过程中不保留完整的树结构,而深度优先搜索则记下完整的搜索树,搜索树起记录解路径和状态判重的作用
为了减少存储空间,在深度优先搜索中,用标志的方法记录访问过的状态,这种处理方法使得深度优先搜索法与回溯法没什么区别了
在回溯法中,我们己分析了非递归的实现过程,在这里就只讨论深度优先的递归实现方法
深度优先搜索的递归实现过程:proceduredfs(i);fori:=1tordoif子结点mr符合条件then产生的子结点mr入栈;if子结点mr是目标结点then输出elsedfs(i+1);栈顶元素出栈(即删去mr);endif;endfor;在讲解递推法时,我们讨论了用递推法解骑土游历问题,在这里我们再看看如何用深度优先搜索法求解此题
搜索算法应用例1骑士游历:设有一个n*m的棋盘,在棋盘上任一点有一个中国象棋马,马走的规则为:1
马只能向右走
当N,M输入之后,找出一条从左下角到右上角的路径
例如:输入N=4,M=4,输出:路径的格式:(1,1)->(2,3)->(4,4),若不存在路径,则输出"no"算法分析:我们以4×4的棋盘为例进行分析,用树形结构表示马走的所有过程(如下图),求从起点到终点的路径,实际上就是从根结点开始深度优先搜索这棵树
马从(1,1)开始,按深度优先搜索法,走一步到达(2,3),判断是否到达终点,若没有,则继续往前走,再走一步到达(4,4),然后判断是否到达终点,若到达则退出,搜索过程结束
为了减少搜索次数,在马走的过程中,判断下一步所走的位置是否在