在a*演算法裡面,有兩個概念,乙個是已經走過的步數g,乙個是走到目標需要的步數h。
例如我從起點s出發,s的g就是0了。往右走一格到t,那t的g就是0+1=1。再走一步,就是1+1=2。反正從g=g的點出發,走一格後的g就是g+1。
h也很好算。例如目標是(m,n),當然格是(u,v),那麼h=abs(u-m)+abs(v-n)
算出g和h之後,我們要算乙個f,簡單的話,f=g+h。實際有些地方會偏重g或h,可以加個權值,這個需要根據實際情況判斷。我們這裡直接令f=g+h。
根據這樣的定義,我們可以看到,如果f越小,則說明走過的步數較少,而且離目標較近,是乙個比較好的點。
a*尋路演算法就是基於上面的理論,其過程如下:
(1)把起點s放到乙個open_list裡面。
(2)對open_list進行排序,找出f最小的格仔。
(3)取出f最小的格仔,放到close_list裡面。
(4)找到當前格仔相鄰的格仔,計算它的f。
1)如果這個格仔在close_list裡面,不用管,跳過。
2)如果這個格仔在open_list裡面,而且f比open_list裡的值小,更新open_list裡的值。
3)如果這個格仔不在open_list裡面,直接加入到open_list。
(5)重複第2步。
實現的**如下:
/// /// 計算路徑
///
public void calcpath()
if (close_dict.containskey(nextto[i]))
int index = -1;
for (int j = open_list.count - 1; j >= 0; j--)
}if (index == -1)
}else}}
if (finish)
}}/// /// 是否合法節點
///
private bool isvalid(posnode pn)
if (maze[pn.row, pn.col] == 1)
return true;
}/// /// 列印路徑
///
public listprintpath()
return list;
}
**就是這麼多,不難吧! 兩種迷宮生成演算法
這裡要介紹兩種迷宮生成的演算法,recursive backtracking和eller s algorithm。它們都生成的是perfect maze,也就是說每個區域都連通,並且沒有環的迷宮。我們現在說recursive backtracking 迷宮的初始狀態是牆壁都存在。選擇乙個開始區域。隨...
c語言實現DES演算法的金鑰生成演算法
直接上源 要求是輸入是金鑰是十六位數,字母要大寫 include int main 置換陣列 int change2 28 int change11 48 int yiwei 16 for i 0 i 16 i 輸入金鑰 for i 0 i 16 i 十六進製制轉換為01字串 if key i 1 ...
C 實現七種經典排序演算法
具體的排序方法如下所示 1 氣泡排序 基本思想 比較相鄰的兩個數,如果前者比後者大,則進行交換。每一輪排序結束,選出乙個未排序中最大的數放到陣列後面。常見氣泡排序演算法如下所示 void bubblesort int arr,int n 公升級版氣泡排序法 通過從低到高選出最大的數放到後面,再從高到...