http://acm.hdu.edu.cn/showproblem.php?pid=1043
转载请注明出处,谢谢http://blog.csdn.net/ACM_cxlove?viewmode=contents by---cxlove
第一个A*搜索,A*是一种启发式搜索,g为已花代价,h为估计的剩余代价,而A*是根据f=g+h作为估价函数进行排列,也就是优先选择可能最优的节点进行扩展。
对于八数码问题,以下几个问题需要知道
判断有无解问题:根据逆序数直接判断有无解,对于一个八数码,依次排列之后,每次是将空位和相邻位进行调换,研究后会发现,每次调换,逆序数增幅都为偶数,也就是不改变奇偶性,所以只需要根据初始和目标状态的逆序数正负判断即可。
HASH问题:根据的是康托展开,具体证明请找网上资料
以及估价函数H:是根据与目标解的曼哈顿距离,也就是每个数字与目标位置的曼哈顿距离之和。
以了以上的基础,便可以通过A*解决八数码问题。
对于这题,实验了下,优先队列第一关键字为f,第二关键字为h,耗时2s+,第一关键字为f,第二关键字为g,耗时1s+,第一关键字为h,第二关键字为g,耗时450ms左右。在搜索过程中,加上判断是否有解,时间变化不大。POJ上0ms
代码:
#include
#include
#include
#include
#include
#include
#include