深搜与宽搜的实现技巧
近来准备C上机考试,做了一些迷宫搜索的题目,这是我在之前的学习中非常薄弱的地方,经过这次学习之后终于有了一些具体的认识,故记录下来。
宽搜在解决最短路径的问题时使用的比较多,宽搜的概念非常简单,就是一层一层的搜索,直到发现目标。这里主要讲实现上。宽搜的实现主要使用了队列,从起点出发,遇到合法的点,就放入队列尾。每次取队列头进行处理,探索到新元素就放在队尾。如果队列中元素全部处理完也没有发现目标,则不存在这样的路径。遇到目标点之后,搜索结束。
这是每一步只要单位时间的简单搜索。如果在某些特定的点,要花费大于一个单位的时间,那么就要找到所有可能到达目标的路径,选择最短路径。
深搜比较适合解决路径的存在性问题,只要发现一个路径存在,搜索结束。深搜在实现上,一般使用递归和回溯。从起点出发,依次探索四个相邻单元,如果下一单元合法且不是目标点,则标记此点,递归,如果递归结束后,表明从这个方向的所有路径均不能到达目标,则取消标记,回溯。
深搜往往和回溯相关,所谓回溯,就是当当前路径走不通,递归结束时,将标记的状态变回递归之前的状态,好从新选择方向。而当求最短路径的问题时,往往标记已经走过的路径,防止重复,造成无限循环。