问题来自Coursera上Princeton所开Algorithms Part I第四周的作业:http://coursera.cs.princeton.edu/algs4/assignments/8puzzle.html
这一次作业要求用Priority Queue实现一个经典的A*搜索算法,来找到一个8-puzzle问题的解(或者在有限时间内发现它的无解性)。
作业要求里对算法的描述很细致,基本照做就能做出来。
https://github.com/jasonlovescoding/Coursera-Princeton-Algorithm
1. Note that we do not count the blank square when computing the Hamming or Manhattan priorities.) Consequently, when the goal board is dequeued, we have discovered not only a sequence of moves from the initial board to the goal board, but one that makes the fewest number of moves. (Challenge for the mathematically inclined: prove this fact.)
证明,当目标节点从PQ中退出时,我们找到的不仅是一个解,而且是步数最少的一个解。
这个性质与MinPQ的数据结构互相联系,算法中每次退出的节点都是最小评分的,我们所用的评分是“曼哈顿距离+步数”。假设我们退出一个目标节点时,在MinPQ中还存在着一个所用步数更少的目标节点,由于目标节点的曼哈顿距离是0,这两个节点(现在退出的,和没找到的那个)的评分都是步数。我们退出的节点的评分是最小的,那么不可能有评分更小的目标节点在MinPQ中,也就是说,我们这次退出的目标节点的步数一定是最小的。(类似也可以证明使用hamming距离+步数作为评分,得到的也是最小步数解)
2. Detecting unsolvable puzzles. Not all initial boards can lead to the goal board by a sequence of legal moves, including the two below:
To detect such situations, use the fact that boards are divided into two equivalence classes with respect to reachab1 2 3 1 2 3 4 4 5 6 5 6 7 8 8 7 9 10 11 12 13 15 14 unsolvable unsolvable