久久久久久久999_99精品久久精品一区二区爱城_成人欧美一区二区三区在线播放_国产精品日本一区二区不卡视频_国产午夜视频_欧美精品在线观看免费

 找回密碼
 立即注冊(cè)

QQ登錄

只需一步,快速開始

搜索
查看: 3485|回復(fù): 0
打印 上一主題 下一主題
收起左側(cè)

A*尋路C++實(shí)現(xiàn)(可直接對(duì)數(shù)組上的兩點(diǎn)四方向?qū)ぢ罚?/span>

[復(fù)制鏈接]
跳轉(zhuǎn)到指定樓層
樓主
ID:108615 發(fā)表于 2016-3-13 00:19 | 只看該作者 回帖獎(jiǎng)勵(lì) |倒序?yàn)g覽 |閱讀模式
  1. #define DTY 20
  2. #define DTX 20

  3. struct point {
  4. int x, y;
  5. };

  6. struct A_node {
  7. // 路徑節(jié)點(diǎn)
  8. struct point pt; // 當(dāng)前節(jié)點(diǎn)坐標(biāo)
  9. int g, h, f; // 評(píng)估值
  10. struct point fpt; // 父節(jié)點(diǎn)坐標(biāo)
  11. struct A_node *next; // 鏈表下一個(gè)節(jié)點(diǎn)
  12. };

  13. struct bu_node {
  14. int fx; // 運(yùn)動(dòng)方向
  15. struct bu_node *next;
  16. };

  17. class Astar {
  18. public:
  19. struct A_node *openlist; // 開啟列表
  20. struct A_node *closelist; // 關(guān)閉列表
  21. struct bu_node *bulist; // 運(yùn)動(dòng)步序列表
  22. struct point spt; // 開始和目標(biāo)點(diǎn)坐標(biāo)
  23. struct point ept;
  24. int DT[DTY][DTX]; // 一張二維數(shù)組表示的地圖(根據(jù)實(shí)際需求設(shè)定大。

  25. Astar(); // 初始化
  26. void setspt(int y, int x); // 設(shè)置開始坐標(biāo)
  27. void setept(int y, int x); // 設(shè)置目標(biāo)坐標(biāo)
  28. void setdt(int dt[DTY][DTX]); // 設(shè)置地圖信息0為通路
  29. void addopennode(struct A_node *node); // 增加一個(gè)開啟節(jié)點(diǎn)
  30. void delopennode(struct A_node *node); // 刪除一個(gè)開啟節(jié)點(diǎn)
  31. void addclosenode(struct A_node *node); // 增加一個(gè)關(guān)閉節(jié)點(diǎn)
  32. int inopenlist(struct A_node *node); // 判斷節(jié)點(diǎn)是否已經(jīng)在開啟列表中
  33. int incloselist(struct A_node *node); // 判斷節(jié)點(diǎn)是否已經(jīng)在關(guān)閉列表中
  34. void pinggu(struct A_node *node, int G); // 對(duì)地圖上的一個(gè)節(jié)點(diǎn)進(jìn)行價(jià)值評(píng)估
  35. void axgo(); // 開始一步尋路
  36. int find(); // 是否找到路徑判定
  37. void gofind(); // 開始尋路
  38. void print();
  39. void addbu(int fx); // 往列表添加一步
  40. int delbu(); // 從列表刪除并返回一步
  41. };

  42. Astar::Astar() {
  43. openlist = NULL;
  44. closelist = NULL;
  45. bulist = NULL;
  46. }

  47. void Astar::setspt(int y, int x) {
  48. spt.y = y;
  49. spt.x = x;
  50. // 設(shè)置并把開始節(jié)點(diǎn)添加到開啟列表
  51. openlist = (A_node *) malloc(sizeof(A_node));
  52. if (openlist == NULL) {
  53. printf("開啟列表創(chuàng)建失敗!");
  54. }
  55. openlist->pt = spt;
  56. openlist->g = 1;
  57. openlist->next = NULL;
  58. }

  59. void Astar::setept(int y, int x) {
  60. ept.y = y;
  61. ept.x = x;
  62. }

  63. void Astar::setdt(int dt[DTY][DTX]) {
  64. for (int y = 0; y < 20; y++)
  65. for (int x = 0; x < 20; x++)
  66. DT[y][x] = dt[y][x];
  67. }

  68. void Astar::pinggu(struct A_node *node, int G) {
  69. if (inopenlist(node)) {
  70. node->f = 0;
  71. node->g = 0;
  72. node->h = 0;
  73. } else if (incloselist(node)) {
  74. node->f = 0;
  75. node->g = 0;
  76. node->h = 0;
  77. } else if (DT[node->pt.y][node->pt.x] == 8) {
  78. node->f = 0;
  79. node->g = 0; // 障礙標(biāo)記這里為貪吃蛇身標(biāo)記
  80. node->h = 0;
  81. } else {
  82. node->g = G + 10;

  83. int H, H1;
  84. H = node->pt.y - ept.y;
  85. if (H < 0)
  86. H = ept.y - node->pt.y;
  87. H1 = node->pt.x - ept.x;
  88. if (H1 < 0)
  89. H1 = ept.x - node->pt.x;
  90. node->h = (H + H1) * 10;

  91. node->f = node->h + node->g;
  92. }

  93. }

  94. void Astar::addopennode(struct A_node *node) {
  95. struct A_node *p;
  96. p = (A_node *) malloc(sizeof(A_node));
  97. *p = *node;
  98. p->next = openlist;
  99. openlist = p;
  100. }

  101. void Astar::delopennode(struct A_node *node) {
  102. struct A_node *p;
  103. p = openlist;
  104. if (openlist != NULL)
  105. openlist = openlist->next;
  106. if (p != NULL) {
  107. *node = *p;
  108. free(p);
  109. }
  110. }

  111. void Astar::addclosenode(struct A_node *node) {
  112. struct A_node *p;
  113. p = (A_node *) malloc(sizeof(A_node));
  114. *p = *node;
  115. p->next = closelist;
  116. closelist = p;
  117. }

  118. void Astar::addbu(int fx) {
  119. struct bu_node *p;
  120. p = (bu_node *) malloc(sizeof(bu_node));
  121. p->fx = fx;
  122. p->next = bulist;
  123. bulist = p;
  124. }

  125. int Astar::delbu() {
  126. struct bu_node *p;
  127. int fx = 0;
  128. p = bulist;
  129. if (bulist != NULL)
  130. bulist = bulist->next;
  131. if (p != NULL) {
  132. fx = p->fx;
  133. free(p);
  134. }
  135. return fx;
  136. }

  137. int Astar::inopenlist(struct A_node *node) {
  138. struct A_node *p;
  139. p = openlist;
  140. while (p != NULL) {
  141. if ((p->pt.y == node->pt.y) && (p->pt.x == node->pt.x))
  142. return 1;
  143. p = p->next;
  144. }
  145. return 0; // 在返回1不在返回0
  146. }

  147. int Astar::incloselist(struct A_node *node) {
  148. struct A_node *p;
  149. p = closelist;
  150. while (p != NULL) {
  151. if ((p->pt.y == node->pt.y) && (p->pt.x == node->pt.x))
  152. return 1;
  153. p = p->next;
  154. }
  155. return 0; // 在返回1不在返回0
  156. }

  157. int Astar::find() {
  158. struct A_node *p;
  159. p = closelist;
  160. while (p != NULL) {
  161. if ((p->pt.y == ept.y) && (p->pt.x == ept.x))
  162. return 1;
  163. p = p->next;
  164. }
  165. return 0; // 在返回1不在返回0
  166. }

  167. void Astar::axgo() {
  168. struct A_node p, p1, p2, p3, p4; // 不斜著走所以只對(duì)四個(gè)方向進(jìn)行評(píng)估
  169. delopennode(&p); // 從開啟列表取出最上層的節(jié)點(diǎn)
  170. addclosenode(&p); // 把這個(gè)節(jié)點(diǎn)加入到關(guān)閉列表
  171. p1.pt.y = p.pt.y + 1; // 上面的節(jié)點(diǎn)
  172. p1.pt.x = p.pt.x;
  173. p2.pt.y = p.pt.y - 1; // 下面的節(jié)點(diǎn)
  174. p2.pt.x = p.pt.x;
  175. p3.pt.y = p.pt.y; // 左面的節(jié)點(diǎn)
  176. p3.pt.x = p.pt.x - 1;
  177. p4.pt.y = p.pt.y; // 右面的節(jié)點(diǎn)
  178. p4.pt.x = p.pt.x + 1;
  179. p1.fpt = p.pt; // 設(shè)置父節(jié)點(diǎn)坐標(biāo)
  180. p2.fpt = p.pt;
  181. p3.fpt = p.pt;
  182. p4.fpt = p.pt;
  183. p1.g = p1.h = p1.f = 0;
  184. p2.g = p2.h = p2.f = 0;
  185. p3.g = p3.h = p3.f = 0;
  186. p4.g = p4.h = p4.f = 0;
  187. if ((p1.pt.y >= 0) && (p1.pt.y < DTY) && (p1.pt.x >= 0) && (p1.pt.x < DTX))
  188. pinggu(&p1, p.g); // 對(duì)當(dāng)前節(jié)點(diǎn)相鄰的節(jié)點(diǎn)進(jìn)行價(jià)值評(píng)估
  189. if ((p2.pt.y >= 0) && (p2.pt.y < DTY) && (p2.pt.x >= 0) && (p2.pt.x < DTX))
  190. pinggu(&p2, p.g);
  191. if ((p3.pt.y >= 0) && (p3.pt.y < DTY) && (p3.pt.x >= 0) && (p3.pt.x < DTX))
  192. pinggu(&p3, p.g);
  193. if ((p4.pt.y >= 0) && (p4.pt.y < DTY) && (p4.pt.x >= 0) && (p4.pt.x < DTX))
  194. pinggu(&p4, p.g);

  195. int bp1, bp2, bp3, bp4;
  196. bp1 = bp2 = bp3 = bp4 = 1; // 排序用入棧標(biāo)記
  197. // 4個(gè)待選節(jié)點(diǎn)排序后入棧
  198. for (int i = 0; i < 4; i++) {
  199. if ((p1.f >= p2.f * bp2) && (p1.f >= p3.f * bp3) && (p1.f >= p4.f * bp4)
  200. && (bp1 == 1)) {
  201. if ((p1.f + p1.g + p1.h) > 0)
  202. addopennode(&p1);
  203. bp1 = 0;
  204. }
  205. if ((p2.f >= p1.f * bp1) && (p2.f >= p3.f * bp3) && (p2.f >= p4.f * bp4)
  206. && (bp2 == 1)) {
  207. if ((p2.f + p2.g + p2.h) > 0)
  208. addopennode(&p2);
  209. bp2 = 0;
  210. }
  211. if ((p3.f >= p1.f * bp1) && (p3.f >= p2.f * bp2) && (p3.f >= p4.f * bp4)
  212. && (bp3 == 1)) {
  213. if ((p3.f + p3.g + p3.h) > 0)
  214. addopennode(&p3);
  215. bp3 = 0;
  216. }
  217. if ((p4.f >= p1.f * bp1) && (p4.f >= p2.f * bp2) && (p4.f >= p3.f * bp3)
  218. && (bp4 == 1)) {
  219. if ((p4.f + p4.g + p4.h) > 0)
  220. addopennode(&p4);
  221. bp4 = 0;
  222. }
  223. }
  224. }

  225. void Astar::gofind() {
  226. while ((openlist != NULL) && (!find()))
  227. axgo();
  228. if (openlist == NULL)
  229. printf("找不到可通行路徑!\n");

  230. if (find()) {
  231. // 生成運(yùn)動(dòng)方向列表
  232. struct A_node *p;
  233. int fx;
  234. p = closelist;
  235. while (p != NULL) {
  236. if (p->fpt.y > p->pt.y)
  237. fx = 1;
  238. else // 上
  239. if (p->fpt.y < p->pt.y)
  240. fx = 2;
  241. else // 下
  242. if (p->fpt.x > p->pt.x)
  243. fx = 3;
  244. else // 左
  245. if (p->fpt.x < p->pt.x)
  246. fx = 4; // 右
  247. addbu(fx);
  248. p = p->next;
  249. }
  250. }
  251. }

  252. void Astar::print() {
  253. printf("開始打印開啟列表:\n");
  254. struct A_node *p;
  255. p = openlist;
  256. while (p != NULL) {
  257. printf("節(jié)點(diǎn)坐標(biāo):%d %d\n", p->pt.y, p->pt.x);
  258. printf("父節(jié)點(diǎn)坐標(biāo):%d %d\n", p->fpt.y, p->fpt.x);
  259. printf("評(píng)估值:%d %d %d\n\n", p->g, p->h, p->f);
  260. p = p->next;
  261. }
  262. printf("\n開始打印關(guān)閉列表:\n");
  263. p = closelist;
  264. while (p != NULL) {
  265. printf("節(jié)點(diǎn)坐標(biāo):%d %d\n", p->pt.y, p->pt.x);
  266. printf("父節(jié)點(diǎn)坐標(biāo):%d %d\n", p->fpt.y, p->fpt.x);
  267. printf("評(píng)估值:%d %d %d\n\n", p->g, p->h, p->f);
  268. p = p->next;
  269. }
  270. }

  271. 用貪吃蛇測試:
  272. #include "ditu.h"
  273. #include "AX.h"
  274. #include "stdio.h"
  275. int main() {
  276. ditu T;
  277. while (1) {

  278. usleep(100000);
  279. clrscr();
  280. T.print();

  281. Astar A;
  282. // 初始化A星算法
  283. A.setspt(T.she_Y, T.she_X);
  284. A.setept(T.shiwu_Y, T.shiwu_X);
  285. A.setdt(T.dt);
  286. // 對(duì)蛇頭和食物開始尋路
  287. A.gofind();
  288. // A.print();//打印開啟和關(guān)閉列表信息

  289. A.delbu(); // 去掉起點(diǎn)信息
  290. int fx;
  291. do {
  292. fx = A.delbu(); // 輸出步序
  293. if (fx == 1)
  294. T.U();
  295. else if (fx == 2)
  296. T.D();
  297. else if (fx == 3)
  298. T.L();
  299. else if (fx == 4)
  300. T.R();

  301. usleep(100000);
  302. clrscr();
  303. T.print();
  304. } while (fx != 0);

  305. }
  306. return 0;
  307. }
復(fù)制代碼


分享到:  QQ好友和群QQ好友和群 QQ空間QQ空間 騰訊微博騰訊微博 騰訊朋友騰訊朋友
收藏收藏 分享淘帖 頂 踩
回復(fù)

使用道具 舉報(bào)

本版積分規(guī)則

手機(jī)版|小黑屋|51黑電子論壇 |51黑電子論壇6群 QQ 管理員QQ:125739409;技術(shù)交流QQ群281945664

Powered by 單片機(jī)教程網(wǎng)

快速回復(fù) 返回頂部 返回列表
主站蜘蛛池模板: 嫩草视频在线看 | 天天玩天天操天天干 | 日本又色又爽又黄的大片 | 高清人人天天夜夜曰狠狠狠狠 | 黄色日批视频 | 成人av电影网| 久久久久久综合 | 欧美又大粗又爽又黄大片视频 | 亚洲精品一区二区在线 | 久久久久久久久久久久久九 | 夜夜摸夜夜操 | 91嫩草精品 | 久久久久久蜜桃一区二区 | 久久精品国产一区 | 特级一级黄色片 | 最新中文字幕久久 | 成人在线观看网站 | 高清一区二区 | 一级毛片在线播放 | 99在线免费观看视频 | 99精品国产一区二区青青牛奶 | 黄色片在线免费看 | 香蕉视频1024| 日韩免费激情视频 | 中国一级特黄毛片大片 | 天天欧美| 一级欧美一级日韩片 | 亚洲男女视频在线观看 | 中文字幕一区二区三区四区 | 亚洲国产精品一区 | 日韩一区二区视频 | 婷婷狠狠| 毛片一级片 | 97超碰中文网 | 亚洲精选一区二区 | 黑人巨大精品 | 国产精品久久久久久中文字 | 中文成人无字幕乱码精品 | 国产1区2区 | 性天堂网 | 一区二区三区四区在线 |