一、搜索區化爲二維數組。
節點被標記爲可通過和不可通過。路徑找到,就從一個節點向另一個。依次循環,直到目的地。
二、方法:從點A開始,檢查相鄰節點,向外擴展
1、從A開始,把它作爲待處理點存入“開啓列表”
2、尋找起點周圍所有可通過的節點,也把它們加入開啓列表。定義A爲“父方格”。
3、從開啓列表中刪除點A,加入“關閉列表”,關閉列表保存不需要再次檢查的節點。
4、選擇開啓列表中的臨近節點。F=G+H,其中含義爲:
1)G=A沿着產生的路徑移動到指定節點的耗費
2)H=從那個節點移動到B的預估移動耗費,稱爲“啓發式”,是個估計值
5、路徑是通過反覆遍歷開啓列表中並選擇最小F值生成。
1)G值,令水平或垂直移動耗費爲10,對角線方向耗費爲14(即10根號2)
2)H值,曼哈頓法。10*(x2-x1+y2-y1).
6、選擇F最小的節點。並:
1)把此節點從開啓列表中刪除,加到關閉列表中,作爲新的父節點。
2)檢查所有相鄰節點,跳過已在關閉列表中的,把可通過的加入開啓列表中。
3)若某個相鄰節點已在開啓列表中,再次檢查路徑。即若用新路徑到達,G值是否更低。
若不是,繼續;若是,改此節點爲父節點,重新計算F值和G值。
7、確定路徑:從目的節點開始,走曾經都父節點的路徑。
三、思路大致如下:
首先有一張地圖x*y的地圖,爲了方便,我們讓每個點都用一個數字(10*x+y)來表示的話,也就是每個點唯一的屬性。
1、定義一個包含點的信息的結構體,包含每個點的G值,F值,x,y座標,它的父節點的x,y座標。並定義此結構體型變量的數組,以存儲路徑。因爲每個結構替裏都包含了節點和它的父節點,因此我們可以用遞歸來輸出路徑。
2、定義一個鏈表,主要儲存開啓列表,關閉列表中的點的信息。之所以是鏈表,是爲了對F值進行動態排列,每增加一個F值,我們都可以按一定順序加入列表中。這樣以來,每次的查找都會很方便。
3、此外,我們還需要設計一個將某點插入鏈表的函數,因爲我們要很頻繁的變換點的歸屬表。
4、點的歸屬表的判斷
5、更新表的F值,因爲我們要不斷做出比較,路徑節點不斷移動,於是隨着G值的改變,F值也會隨之改變。
6、判斷方向的可行性
7、求出可行方向的點座標,即下面經常講到的“新點”。
8、最後寫A星主程序
開啓列表=關閉列表=NULL——創建開啓列表,head節點就是路徑的起點,也就是第一個父節點
循環:把父節點從開啓列表中刪除——判斷是否到達終點——是,break,跳出while
——否——從右,下,左,上四個方向判斷哪個方向可通過——得到一個可通過方向——計算一個新節點——判斷在哪個列表中,可以用flag來標記
——都不在,則加入開啓列表
——在開啓列表,比較他們的F值,更新
——在關閉列表,比較他們的F值,更新,轉移到開啓列表
——將父節點加入到關閉列表中——判斷開啓列表是否爲空——否,則將剛剛的新節點又作爲父節點賦值給起點座標——回到循環開頭