[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代表有牆壁不通路 例如下圖中是一條通路 窮舉法 從入口出發,順某方向向前探索,如能走通,則繼續往前走,否則沿原路返回,換乙個方向再試,直到所有可能的銅鑼都探索到為...