使用A 演算法求解迷宮路徑問題 哈工大演算法實驗二

2021-10-09 18:26:39 字數 1857 閱讀 2342

其他相關實驗

使用蠻力法、grahamscan和分治法求解凸包問題——哈工大演算法實驗一

使用貪心近似、線性規劃捨入法和精確法求解集合覆蓋問題——哈工大演算法實驗三

隨機快排和三路快排的實現——哈工大演算法實驗四

尋路問題,輸入乙個方格表示的地圖,要求用a*演算法找到並輸出從起點(再放各種標示字母s)到終點(在方格中標示字母t)的代價最小的路徑,有如下條件及要求:

1.每一步都落在方格中,而不是橫豎線的交叉點

2.灰色格仔表示障礙,無法通行

3.在每個格仔處,若無障礙,下一步可以達到八個相鄰的格仔,並且可以到達無障礙的相鄰格仔。其中,向上、下、左、右四個方向移動的代價為1,向四個斜角方向移動的代價為√2

4.在一些特殊格仔上行走要花費額外的地形代價,比如黃色格仔代表沙漠,經過它的代價為4;藍色格仔代表溪流,經過它的代價為2;白色格仔為普通地形,經過它的代價為0

5.經過一條路徑的總代價為移動代價+地形代價。其中移動代價是路徑上所做的所有移動的代價的總和;地形代價為路徑上除起點外所有格仔的地形代價的總和。

演算法a* single(d, s, t)

輸入 :平面上n個點的二維陣列d,起始點s,終點t

輸出 :從s到t的路徑

1: openlist.push(s)

2: while(true)

3: 尋找openlist中f值最低的格,稱為當前格p

4: closelist.push§

5: if 它不可通過||已經在closelist中 then ;

6: if 它不在openlsit中

7: then openlist.push§,把p作為該格的父節點,計算fgh值

8: if 它已在openlist中

9: then if 它的f值更低

10: then 把p作為該格的父節點,重新計算fgh值

11: if 目標格已經在openlist中

12: then break

13: 從t開始,沿著每一格的父節點回溯,直到回到s,輸出路徑

演算法a* bidirection(d, s, t)

輸入 :平面上n個點的二維陣列d,起始點s,終點t

輸出 :從s到t的路徑

1: openlist1.push(s)

2: openlist2.push(t)

3: while(true)

4: 尋找openlist1中f值最低的格,稱為當前格p1

5: 尋找openlist2中f值最低的格,稱為當前格p2

6: if p1不可通過||已經在closelist1中 then ;

7: if 它已在openlist1中

8: then if 它的f值更低

9: then 把p1作為該格的父節點,重新計算fgh值

10: if p2不可通過||已經在closelist2中 then ;

11: if 它已在openlist2中

12: then if 它的f值更低

13: then 把p2作為該格的父節點,重新計算fgh值

14: if openlist1和openlist2中存在相同點

15: then break

16: 從s和t分別開始,沿著每一格的父節點回溯,直到回到相遇點,輸出路徑

求解迷宮問題(不是最佳路徑)

include define maxsize 50 define m 10 define n 10 int m m n struct st maxsize 另乙個堆疊的方式 結構陣列 int top 1 棧指標 void mgpath int x1,int y1,int x2,int y2 定義乙個...

C 迷宮問題的求解演算法

一 實驗目的 1 熟練掌握鏈棧的基本操作及應用。2 利用鍊錶作為棧的儲存結構,設計實現乙個求解迷宮的非遞迴程式。二 實驗內容 問題描述 以乙個mn的長方陣表示迷宮,0和1分別表示迷宮中的通路和障礙。設計乙個程式,對信任意設定的迷宮,求出一條從入口到出口的通路,或得出沒有通路的結論。基本要求 首先實現...

迷宮求解問題 堆疊的使用

queue.h define stack init size100 define stackincrement10 define statusbool define error0 define overflow 2 define ok1 struct postype typedef struct s...