题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1043
http://poj.org/problem?id=1077
题意:经典的八数码问题,问给出的一个状态能否通过移动达到一个目标状态,如果能就输出一个可行的移动方式.
看过好几本书上面都有八数码问题的介绍,采用A*搜索,可一开始写的用不在目标位置上的方块个数作为h(n),可一直超时~
然后改成各个方块到目标状态的曼哈顿距离,在北大OJ上AC了,尴尬的是HDU上给了整整五倍的时间,还是超时了,今天去图书管看看新书有没有到,然后又翻了翻以前看过的一本算法书籍,看到了一个高效的估价函数,即
h(n)=d(n)+3*g(n)
其中d(n)为各方块到目标状态的曼哈顿矩离,g(n)为非中心的每个方块的后继是否为其目标状态的后继,如果不是,g(n)+=2,最后如果中间位置的方块和目标状态不同g(n)+=1;
结果是,原来在POJ上700+msAC的代码,时间一下子降到了32ms~ 不过郁结的是在HDU上还是花费500+ms的时间 ...
代码: