尋路:尋找最短路徑並避開障礙物
首先將地圖虛擬化,將地圖劃分為乙個乙個的小方塊,這樣可以用二維陣列來表示地圖。如下所示,綠色塊(a)是起點,紅色塊(b)是終點,中間藍色塊是障礙物,白色塊是空地。
先羅列出所有的步驟,等會按照例子一步一步分析
1 尋路步驟:
步驟1.從起點a開始,把a作為乙個等待檢查的方格,放入到「開啟列表」中,開啟列表就是乙個存放等待檢車方格的列表
步驟2.尋找起點a周圍可以到達的方格(最多八個),將它們放入到「開啟列表」,並設定它們的父方格為a
步驟3.從「開啟列表」中刪除點a,並將a放入到「關閉列表」中,「關閉列表」存放的是不再需要檢查的方格
步驟4.計算每個方格的f值
f=g+h:
g 表示從起點a移動到指定方格的移動消耗,我們假設橫向移動乙個格仔消耗10,斜向移動乙個格仔消耗14(具體值可以根據情況修改)
h 表示從指定的方格移動到目標b點的預計消耗,我們假設h的計算方法,忽略障礙物,只可以縱橫向計算
步驟5.從「開啟列表」中選擇f值最低的方格c,將其從「開啟列表」中刪除,放入到「關閉列表」中
步驟6.檢查c所有臨近並且可達的方格(障礙物和「關閉列表」中的方格不考慮),如果這些方格還不在「開啟列表」中的話,將它們加入到開啟列表,並且計算這些方格的f值,並設定父方格為c。
步驟7.如果某相鄰的方格d已經在「開啟列表」,計算新的路徑從a到達方格d(即經過c的路徑),g值是否更低一點,如果新的g值更低,則修改父方格為方格c,重新計算f值,h值不需要改變,因為方格到達目標點的預計消耗是固定的。但如果新的g值比較高,則說明新的路徑消耗更高,則值不做改變。
步驟8.繼續從「開啟列表」中找出f值最小的,從「開啟列表」中刪除,新增到「關閉列表」,再繼續找出周圍可以到達的方塊,如此迴圈
步驟9.當「開啟列表」**現目標方塊b時,說明路徑已經找到。除了起始方塊a,每乙個曾經或者現在還在「開啟列表」中的方塊,都存在乙個「父方格」,可以從目標點b通過父方格索引到起始方塊,這就是路徑。
2 案例分析:
步驟1,2,3:方塊a已經放入到「關閉列表」,周圍臨近的8個方格(沒有障礙物)已經放入到「開啟列表」
步驟4:計算f=g+h
以方格c為例,為了方便統計,將左上角數字記為f值,左下角為g值,右下角為h值,則如下所示:(箭頭的起點為該方格的父方格)
步驟5,6:我們發現c的f值最小,將其從「開啟列表」中移除,加入到「關閉列表」中。c右邊三個是障礙物不考慮,左邊起始方塊a已經加入到「關閉列表」,不考慮。則候選的方塊也只有上下四個:,而且也已經存在「開啟列表」中。
步驟7:從開啟列表中找出f最小的,我們發現上下兩個同為54,取哪個都可以,選擇上面的方格d。
重新計算g值,路徑a-c-d 計算g值為20,比原來的a-d路徑的g值14要大,則值不變,方格d的父方格不變。
步驟8:跳到步驟5開始,選擇f值最小的d,將其從「開啟列表」中移除,加入到「關閉列表」中。將周圍可達方格加入到「開啟列表」並計算f值
我們規定如果上下左右有障礙物,則對應的右上,右下,左上,左下不可到達,所以方格d右上角不可到達。將可到達的方格e1,e2加入「開啟列表」,計算f值,然後再比較到達周圍方格的g值是否存在更小值,最後發現 「開啟列表」裡f最小的方格是e3方格,然後再次跳到步驟5,繼續執行。。。
步驟9:當迴圈15遍後,如下圖所示(圖畫得快吐了,其中打叉的方格表示在「關閉列表」中),目標方塊b出現在「開啟列表」中,結束迴圈!
通過目標點b的父方格索引到起始方塊a,這就是路徑,如下所示:
最優對稱路徑
湖南省第七屆大學生計算機程式設計競賽 the seventh hunan collegiate programming contest 題目g最優對稱路徑 給乙個n行n列的網格,每個格仔裡有乙個1到9的數字。你需要從左上角走到右下角,其中每一步只能往上 下 左 右四個方向之一走到相鄰格仔,不能斜著走...
最優對稱路徑
給乙個n行n列的網格,每個格仔裡有乙個1到9的數字。你需要從左上角走到右下角,其中每一步只能往上 下 左 右四個方向之一走到相鄰格仔,不能斜著走,也不能走出網格,但可以重複經過乙個格仔。為了美觀,你經過的路徑還必須關於 左下 右上 這條對角線對稱。你的任務是統計所有合法路徑中,數字之和最小的路徑有多...
迷宮的最優路徑
對於迷宮最優路徑,其中之一方法就是把所有路徑都找出來如下 1 1 1 1 1 1 1 1 1 1 對於這樣的迷宮,從 0 0 到 4 4 所有路徑有 00 01 11 21 31 41 31 32 33 34 44 以及 00 01 11 21 31 32 33 34 44 這樣在一條路徑重複走同一...