A 演算法C 簡單實現

2021-08-18 21:09:52 字數 2477 閱讀 1550

一. 演算法步驟:

1. 初始化圖,openlist,closedlist

2. 將起點加入openlist,

3. 在openlist中尋找啟發函式值f=g+h最小的節點v,

4. 將v從openlist中刪除,

5. 將從openlist中刪除的節點v加入closedlist

6. 對於節點v周圍的8個節點v1而言:

如果v1是障礙物或者已經處於closedlist中了,則不做任何處理

如果v1不在openlist中則將v1加入openlist中

如果v1已經在openlist中,則比較v1經過v到達起點的代價g1是否比之前的代價g0要小,如果g1大於g0,不做任何處理,如果g17. 如果終點goal也位於openlist中,說明路徑已經找到,否則返回步驟3進行迴圈

8. 如果openlist為空,終點還沒有找到,則說明路徑不存在

9. 最後從終點gaol通過其父節點回溯,尋找起點到終點的路徑。

二. 演算法實現

用c++實現a*, 其中包含兩個物件,節點物件,及a*路徑搜尋物件。

節點類可以如下定義:

1. astarnode:

#includeclass astarnode

void cal_f()

void cal_g(astarnode* cur_point)

void cal_h( astarnode* end) // 曼哈頓距離

};

2. a*路徑搜尋類astar如下定義:

#include#include"astarnode.h"

#include"minheap.h"

class astar

;

#include"astar.h"

astar::astar():openlist, closedlist()

,,,, }; }

astar::astar(std::vector < std::vector> &maz, int capacity) :openlist

bool astar::isinclosedlist(std::vector&closedlist1, int x, int y)

}}

int ine= openlist.isinheap(end.x, end.y);

if (ine)

return &openlist.date[ine];

} return null;

}bool astar::isobstacle(int x,int y)

int astar::cal_g(astarnode* cur_point, astarnode* sur_point)

void astar::getpath(astarnode *end)

}void astar::printpath()

int size_y = map.size();

int size_x= map[0].size();

std::cout << "a*搜尋結果" << std::endl;

for (int i = 0; i < size_y; i++)

}

3. 主函式

#include#include"astar.h"

int main()

,,,, };

int size_y = map.size();

int size_x = map[0].size();

std::cout << size_x << " " << size_y << std::endl;

for(int i=0;ix = 0;

start->y = 3;

start->parent = null;

start->f = 0;

start->g = 0;

start->h = 0;

astarnode *end = new astarnode;

end->x = 5;

end->y = 4;

end->parent = null;

end->f = 0;

end->g = 0;

end->h = 0;

int cap = 100;

astar astar;

astarnode *endpoint=astar.findpath(*start, *end);

astar.getpath(endpoint);

astar.printpath();

return 0;

}

三. 參考文獻

1. a*,那個傳說中的演算法

2. 堪稱最好的a*演算法

3. a*尋路演算法c++簡單實現 

C 實現簡單回文演算法

1.實現簡答回文演算法 編寫乙個程式,判斷乙個字串是否為 回文 回文串 字串字元從前往後與從後往前一致 中心對稱 2.回文演算法思路 通過回文字串的移位比較,檢查是否為回文。3.回文演算法實現 include stdafx.h include include using namespace std ...

Elgamal演算法 簡單C語言演算法實現

目錄 elgamal演算法實現 1.基本演算法 2.具體演算法 3.4.結果 快速冪演算法 pow mod a,b,p 計算a b mod p elgamal加密演算法 elgamal en m,pub,p,g,c1,c2 c1 g k mod p c2 m pub k mod p 其中k為任意整數...

C 雜湊查詢演算法簡單實現

示例 主要使用雜湊表的摺疊法,其實只要懂原理,其實都好辦這種 標頭檔案部分 include stdafx.h 雜湊結果 enum hash result type 構建類似map的結構體 不使用std自帶的方法 struct map class batch int m index 當前位置 map ...