本搜索专题会参考vjudge上的《kuangbin带你飞》系列题目,前面2篇是基础题,后面会慢慢复杂起来!加油!
前两篇展示了DFS和BFS的基本应用,可能大家觉得比较简单,回顾一下,DFS一般用于求所有解的情况,BFS用于求最短路类型的问题,DFS缺点是容易迷失自己,优点是不用维护队列,省空间。BFS缺点是需要队列在处理寻路这样的问题时比较耗费空间,优点是循序渐进的容易找最优解。本篇接着看BFS的启发式搜索A*算法。虽然BFS搜索路径已经不错了,但是每次都是按部就班的从队列里先进先出的取元素,这样有点太古板了。于是在某些情况下可以采用优先队列来替代普通队列,优先队列这个BFS搜索本来打算写一篇文章的,现在直接放在A*里面理解吧。优先队列是指在搜索解时,选取一条最优路径,比如当前代价最小的路径。然而这样有一个缺点,那就是当前代价小并不代表最终这条路径是最小的。理想情况下是知道当前消耗和接下来需要消耗的,然而未知路径的消耗只有先知才知道 。如下图: 于是有人便想到了,虽然不能够确定未知路径的代价H,但是我们可以大概估算一下代价H啊,小学老师就说过,估算是一项非常重要的能力,A*算法里面估算就是核心了(虽然看上去会感觉不靠谱)。嗯,大概思路就有了,A*算法 = 优先队列 + 未知估值那么未知估值具体要怎么做呢?这又是一个类似于DP算法要怎么写呢的问题 只有针对特定的题目,我们才知道要怎么写,适合意会不好言传,还是看题领悟吧。题目很简单,其实重点是看懂代码。代码其实也很清晰,重点是花点耐心看完~The 15-puzzle has been around for over 100 years; even if you don't know it by that name, you've seen it. It is constructed with 15 sliding tiles, each with a number from 1 to 15 on it, and all packed into a 4 by 4 frame with one tile missing. Let's call the missing tile 'x'; the object of the puzzle is to arrange the tiles so that they are ordered as:
15谜题已经有100多年历史了。即使不知其名,肯定也见过。它由15个滑动块组成,每个滑动块由数字1到15标记,并且被放在4x4大小的框框里面,缺失一个块。缺失的称之为x。谜题的目标就是将这些块有序的整理起来。如下图:
1 2 3 4
5 6 7 8
9 10 11 12
13 14 15 x
where the only legal operation is to exchange 'x' with one of the tiles with which it