A start演算法C 實現

2021-09-24 18:21:59 字數 4294 閱讀 6298

#include

#include

#include

#include

using

namespace std;

class

node

;bool

compare

(node* n1, node* n2)

;class

node

node

(int x,

int y, node* parent)};

//0表示可通過1表示障礙物

int map[

101]

[101]=

,,,,

,,};

vector> openlist;

// 要能要走的點

vector> closelist;

int row;

//地圖總行數

int col;

//地圖總列數

node* startpos;

//開始點

node* endpos;

//結束點

int weightw;

//平移權重

int weightwh;

//斜移權重

// h 為到終點的距離

intcounth

(node* snode, node* enode)

//************************************

// method: countfgh

// access: public

// returns: void

// qualifier: 計算乙個節點的 f g h 值

// parameter: node * snode 當前結點

// parameter: node * enode 終點

// parameter: int cost 父結點到當前結點的消耗g

//************************************

void

countfgh

(node* snode, node* enode,

int cost)

//檢測列表是否包含指定節點

intiscontains

(vector>

* v,

int x,

int y)

}return-1

;}void

initmap()

// 輸出地圖

void

printmap()

printf

("\n");

}}// 對 f 又進行了一次排序/*

返回 0 互換位置,返回 1 不換

如果n1 大於 n2,返回0, 則需要進行一次互換

如果n1 小於等於 n2,返回1,則不需要互換

具體來說,就是當前面的大於後面的時,那麼就要進行一次互換,則排序完成後,

是由小到大開始進行排序的。*/

bool

compare

(node* n1, node* n2)

//************************************

// method: checkmove

// returns: void

// parameter: int x 下一步要移動的x座標

// parameter: int y 下一步要移的y座標

// parameter: node * parent 移動後的父結點

// parameter: node * end 這個是真正的終點座標

// parameter: int cost 下一步要移動的結點到父節點的消耗

//************************************

void

checkmove

(int x,

int y, node* parent, node* end,

int cost)

// 如果下一步要走的格點為以經走過的格點,那麼直接返回if(

iscontains

(&closelist, x, y)!=-

1)// 取出

int index =-1

;if((index =

iscontains

(&openlist, x, y))!=

-1)}

else

}void

printpath

(node* node)

//將走過的點標記為2

//map[node->x][node->y] = 2;

printf

("->%d,%d"

, node-

>x, node-

>y);}

void

releasenode

(node* n)

delete n;

}//************************************

// method: startsearch

// returns: int -1錯誤0沒找到1找到

// qualifier: 主尋路演算法

// parameter: node * start 起點

// parameter: node * end 終點

//************************************

intstartsearch

(node* start, node* end)

// 如果結束點或開始點在牆上,那麼直接為錯

if(map[start-

>x]

[start-

>y]==1

|| map[end-

>x]

[end-

>y]==1

) start-

>h =

counth

(start, end)

; start-

>f = start-

>h + start-

>g;

openlist.

push_back

(start)

; node* root =

null

;int find =0;

while

(openlist.

size()

>0)

// 對八個方向分批次判斷

//上下左右

if(root-

>x >0)

if(root-

>y >0)

if(root-

>x < row -1)

if(root-

>y < col -1)

// 左下

if(root-

>x < row -

1&& root-

>y>0)

// 右上

if(root-

>y < col -

1&& root-

>x>0)

// 左上

if(root-

>x >

0&& root-

>y >0)

// 右下

if(root-

>y < col -

1&& root-

>x < row -1)

closelist.

push_back

(root)

; openlist.

erase

(openlist.

begin()

);sort

(openlist.

begin()

, openlist.

end(

), compare);}

if(find)

releasenode

(root)

; openlist.

clear()

; closelist.

clear()

;return find;

}int

main

(int argc,

char

*ar**)

else

if(t ==0)

else

system

("pause");

return0;

}

A 演算法 c 實現

最近舍友突然說起a 演算法 雖然之前看過 但是我發現自己記得不是很清楚了 而且從來沒去手動實現過 趁著這次就實現一下加深理解 去網上查了下原理 看了幾篇別人的實現 然後按自己理解綜合一下寫出來記錄一下 我參考那篇程式執行有好幾個問題,而且執行得出路徑也是不對的,不知道他有沒跑過的。astar.h i...

c 實現svm SVM演算法實現

前面我們介紹了svm演算法的原理,這裡通過python以及小例子來實現svm演算法。這裡主要介紹兩個例子,乙個例子通過調包實現svm,乙個例子通過程式設計實現。一 癌症資料集 資料來自國外某醫院癌症資料,資料量為100,劃分70條記錄用於訓練集,資料如下所示 圖中diagnosis result是癌...

c 實現rsa演算法 RSA演算法實現過程

rsa演算法是實現非對稱加密的一種演算法,其用到很多有關數論的內容,在此我們不多討論。而將目光聚焦於演算法的實現過程。rsa過程 第二步 計算n a b 61 53 3233 第三步 計算 a 1 b 1 60 52 3120 第四步 選擇與3120互質的乙個數e 17,這個e也就是我們的公鑰,需要...