C 實現4種經典迷宮生成演算法和迷宮尋路演算法(六)

2021-09-02 17:31:50 字數 1166 閱讀 1392

在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 公升級版氣泡排序法 通過從低到高選出最大的數放到後面,再從高到...