看完了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距離的方式:忽略所有的阻礙,只能走邊,不能對角線。通過這樣的估算方法,效率還是比較高的。
好了,我需要的差不多就這麼多。
其它的還是留給星際爭霸的技術部解決吧……