看完了A* 算法的讲解,总结出来就是求F=G+H 然后直接dfs就完了。
我入门完全是看的这篇文章 http://www.360doc.com/content/16/1201/12/99071_610999046.shtml
这里面有很多很好的扩展,可惜该死的360doc不让我点进去……需要登陆……
我发现A* 算法的思想用途其实很广:
第k短路,据说A* + Dijkstra也是很好用的,…………
其实主要就是A* 的思想:
有两个集合:open list ,close list 后者里面是处理完了的节点。
这跟Tarjan,最短路问题,最小生成树都很像。
开始只有起点在open list 里面。不断从open list 里面选择F最小的(F=G+H),将这个节点V加入close list ,然后将所有V能到达的节点加入open list。
G是原点到V的距离(这里有一个小技巧:如果可以走正方形对角线,可以把正方形边设为10,对角线设为14.因为正常情况下对角线等于边的1.414倍,在没有特别高的精度要求下,10,14就够了)这个距离可以通过struct记录(struct node)然后每次松弛更新就行了。
H是V到终点的估算距离,我学的是Manhattan距离的方式:忽略所有的阻碍,只能走边,不能对角线。通过这样的估算方法,效率还是比较高的。
好了,我需要的差不多就这么多。
其它的还是留给星际争霸的技术部解决吧……