A 演算法求解迷宮

2021-06-20 19:52:34 字數 3387 閱讀 1456

[cpp] view plaincopy

#include #include #include using namespace std;

//方向向量

int direc[4][2]=,,,};

//封閉,開放列表標記

enum flag

;

//**********=最小堆節點類**********==

//堆優先順序為:f=g+h

//g為當前的路徑長

//h為估計當前位置到目標位置開銷探測:當前節點(x,y),目標節點(x0,y0),則以曼哈頓距離作為h,h=|x-x0|+|y-y0|

typedef struct node

queue_node;

//_seal結構體,儲存結點的開放(封閉)標記,儲存開放結點的指標

typedef struct

seal;

//**********===a*演算法類**********===

//類成員列表如下:

演算法核心

//2.計算曼哈頓距離h函式

//3.迷宮輸入函式

//4.最優解路徑輸出函式

//5.封閉列表

//6.最小堆實現開放列表

//7.迷宮長,寬

//8.迷宮地圖

//9.起點,目標點

//10.最小堆排序函式

//11.絕對值函式

//12.邊界判斷

//13.列印路徑

class a_star

cout<_maze>

_seal[i][j].flag=unvisited;

_seal[i][j].point=null;

} }

cout<_sx>>_sy>>_ex>>_ey;

if(_maze[_sx][_sy]=='1'||_maze[_ex][_ey]=='1'||bound(_sx,_sy)==false||bound(_ex,_ey)==false)

if(_seal[tx][ty].flag==unvisited)

else

} }

} cout

cout<

} //邊界判斷

bool bound(int x,int y)

//計算曼哈頓距離h函式

int get_h(int x,int y)

//絕對值函式

int ab(int i)

private:

//仿比較函式結構體

struct cmp

};

priority_queue,cmp> _open;//最小堆(開放列表)

int _len,_wid;//迷宮左邊長,上邊寬

int _sx,_sy,_ex,_ey;

seal **_seal;//動態開闢封閉列表

unsigned char **_maze;//迷宮地圖

};

int main()

a*

演算法總結

1.將開始節點放入開放列表

(開始節點的f和

g值都視為

0);

2.重複一下步驟:

i.       

在開放列表中查詢具有最小

f值的節點

,並把查詢到的節點作為當前節點;

ii.       

當前節點從開放列表刪除

, 加入到封閉列表;

iii.       

當前節點相鄰的每乙個節點依次執行以下步驟:

1.如果該相鄰節點不可通行或者該相鄰節點已經在封閉列表中

,則什麼操作也不執行

,繼續檢驗下乙個節點;

2.如果該相鄰節點不在開放列表中

,則將該節點新增到開放列表中

, 並將該相鄰節點的父節點設為當前節點,

同時儲存該相鄰節點的g和

f值;

3.如果該相鄰節點在開放列表中

, 則判斷若經由當前節點到達該相鄰節點

g值是否小於原來儲存的g值

,若小於

,則將該相鄰節點的父節點設為當前節點,

並重新設定該相鄰節點的g和

f值.

iv.       

迴圈結束條件:

終點節點被加入到開放列表作為待檢驗節點時

, 表示路徑被找到

,此時應終止迴圈;

或者當開放列表為空

,表明已無可以新增的新節點

,而已檢驗的節點中沒有終點節點則意味著路徑無法被找到

,此時也結束迴圈;

3.從終點節點開始沿父節點遍歷

, 並儲存整個遍歷到的節點座標

,遍歷所得的節點就是最後得到的路徑;

路徑排序

決定哪些方格會形成路徑的關鍵是下面這個等式:

f = g + h

這裡·               

g=從起點

a沿著已生成的路徑到乙個給定方格的移動開銷。

·               

h=從給定方格到目的方格的估計移動開銷。這種方式常叫做試探,有點困惑人吧。其實之所以叫做試探法是因為這只是乙個猜測。在找到路徑之前我們實際上並不知

道實際的距離,因為任何東西都有可能出現在半路上(牆啊,水啊什麼的)。本文中給出了一種計算

h值的方法,網上還有很多其他文章介紹的不同方法。

我們要的路徑是通過反覆遍歷開放列表並選擇具有最小

f值的方格來生成的.

重要的是,在計算h

值時並不考慮任何障礙物。因為這是對剩餘距離的估計值而不是實際值(通常是要保證估計值不大於實際值

――譯者注)。這就是為什麼這個方式被叫做試探

法的原因了。

主要在於維護開放封閉列表的方式,這裡用乙個結構體矩陣_seal標記開放或者封閉,如果開放,則point還記錄了該格仔所對應狀態結點的指標,可以方便直接取出該節點修改資訊.

C 迷宮問題的求解演算法

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

AI 隨機迷宮 迷宮求解

本文記錄了,人工智慧中簡單的搜尋策略中的路徑搜尋策略中的a 演算法,來實現迷宮尋路的問題.這只是一次本人的課外作業 完整的程式原始碼已經傳送到我的git.這裡只記錄了我的思路和感想以及收穫.產生隨機迷宮 迷宮求解沒有迷宮怎麼可以呢.而本人是個懶人,每次都要手動輸入迷宮,重複性的工作讓我很不爽.你可以...

迷宮求解 窮舉求解法

迷宮求解是乙個理解資料結構中棧的比較好的實踐例子,下面進行分析 設迷宮是又乙個2維陣列組成的,元素只有0或1來表示是否通路,0代表通路,1代表有牆壁不通路 例如下圖中是一條通路 窮舉法 從入口出發,順某方向向前探索,如能走通,則繼續往前走,否則沿原路返回,換乙個方向再試,直到所有可能的銅鑼都探索到為...