#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也就是我們的公鑰,需要...