A* 寻路算法学习

代码小记

  1 #include <iostream>
  2 #include <list>
  3
  4 struct POINT {
  5     int X;
  6     int Y;
  7 };
  8
  9 // G: 起点到当前点的成本
 10 // H: 当前点到终点的估算成本
 11 // F: G,H之和
 12 struct MapNode {
 13     int G;
 14     int H;
 15     int F;
 16     bool can_pass;
 17     POINT pt;
 18     MapNode* pParent;
 19
 20     MapNode() : G(0), H(0), F(0), can_pass(false), pParent(NULL) {}
 21
 22     bool operator==(const MapNode& other) {
 23         return (other.pt.X == pt.X && other.pt.Y == pt.Y);
 24     }
 25
 26     bool operator!=(const MapNode& other) {
 27         return !(*this == other);
 28     }
 29 };
 30
 31 bool nodeCompare(MapNode* p1, MapNode* p2) {
 32     return (p1->F <  p2->F);
 33 }
 34
 35 int maps[20][30] = {
 36     1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,
 37     1,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,
 38     1,0,1,0,0,0,1,1,1,1,1,1,1,1,1,1,1,1,0,1,1,1,1,1,1,1,1,1,0,1,
 39     1,0,1,1,1,0,1,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,1,0,1,
 40     1,0,0,0,1,0,1,0,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,0,1,0,1,
 41     1,0,1,1,1,0,1,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,1,0,1,
 42     1,0,1,0,1,0,1,0,0,0,0,0,0,0,0,0,0,1,0,1,1,1,1,1,1,1,1,1,0,1,
 43     1,0,1,0,1,0,1,1,1,1,1,1,1,1,1,1,0,1,0,0,0,0,0,0,0,0,0,1,0,1,
 44     1,0,1,0,1,0,0,0,0,0,0,0,0,0,0,0,0,1,1,1,1,1,1,1,1,1,0,1,0,1,
 45     1,0,1,0,1,1,1,1,1,1,1,1,1,1,1,1,0,1,0,0,0,0,0,0,0,0,0,1,0,1,
 46     1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,1,1,1,1,1,1,1,1,1,0,1,
 47     1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,0,1,0,0,0,0,0,0,0,0,0,1,0,1,
 48     1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,1,1,1,1,1,1,1,0,1,0,1,
 49     1,0,1,1,1,1,1,1,1,1,1,1,1,1,1,1,0,1,0,0,0,0,0,0,0,0,0,1,0,1,
 50     1,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,1,1,1,1,1,1,1,1,1,0,1,
 51     1,0,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,0,0,0,0,0,0,0,0,0,1,0,1,
 52     1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,1,0,1,
 53     1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,0,1,1,1,1,0,1,1,1,1,1,1,0,1,
 54     1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,
 55     1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1
 56 };
 57
 58 MapNode* findNode(std::list<MapNode*>& nodes, const POINT& pt) {
 59     for(std::list<MapNode*>::iterator it = nodes.begin();
 60             it != nodes.end();
 61             ++it) {
 62         if((*it)->pt.X == pt.X && (*it)->pt.Y == pt.Y) {
 63             return *it;
 64         }
 65     }
 66     return NULL;
 67 }
 68
 69 void pathFinding() {
 70     std::list<MapNode*> all;
 71     std::list<MapNode*> open;
 72     std::list<MapNode*> close;
 73
 74     for(int row=0; row<20; ++row) {
 75         for(int col=0; col<30; ++col) {
 76             MapNode* pNode = new MapNode;
 77             pNode->pt.X = row;
 78             pNode->pt.Y = col;
 79             pNode->can_pass = (maps[row][col] == 0 ? true : false);
 80             all.push_back(pNode);
 81         }
 82     }
 83
 84     POINT pt_start = {1, 1};
 85     POINT pt_target = {10, 16};
 86     MapNode* pStart = findNode(all, pt_start);
 87     MapNode* pTarget = findNode(all, pt_target);
 88
 89     open.push_back(pStart);
 90     while(!open.empty()) {
 91         open.sort(nodeCompare);
 92         MapNode *pNode = open.front();
 93         if (*pNode == *pTarget) {
 94             break;
 95         }
 96         open.pop_front();
 97         close.push_back(pNode);
 98         // 查找周围节点并将合适的加入open
 99         int ptMask[8][3] = { // x坐标相对位置,y坐标相对位置,移动耗费
100             {-1, -1, 14}, // 左上
101             {0 , -1, 10}, // 正上
102             {1 , -1, 14}, // 右上
103             {-1, 0 , 10}, // 正左
104             {1 , 0 , 10}, // 正右
105             {-1, 1 , 14}, // 左下
106             {0 , 1 , 10}, // 正下
107             {1 , 1 , 14}  // 右下
108         };
109         for(int i=0; i<8; ++i) {
110             POINT pt;
111             pt.X = pNode->pt.X + ptMask[i][0];
112             pt.Y = pNode->pt.Y + ptMask[i][1];
113
114             if(pt.X > 0 && pt.X < 30 && pt.Y >0  && pt.Y < 20) {
115                 MapNode* pChildNode = findNode(all, pt);
116                 if(!pChildNode->can_pass || NULL != findNode(close, pt)) {
117                     // 如果pNodeLT不可抵达的或者它在 close list 中,忽略它
118                 } else {
119                     if(NULL == findNode(open, pt)) {
120                         // 如果pNodeLT不在 open list 中,把它加入 open list,
121                         // 并且把当前方格设置为它的父亲,记录该方格的F,G和H值
122                         pChildNode->pParent = pNode;
123                         pChildNode->G = pChildNode->pParent->G + ptMask[i][2];
124                         pChildNode->H = 10 * (abs(pTarget->pt.X - pt.X) + abs(pTarget->pt.Y - pt.Y));
125                         pChildNode->F = pChildNode->G + pChildNode->H;
126                         open.push_back(pChildNode);
127                     } else {
128                         // 如果pNodeLT已经在 open list 中,检查这条路径 ( 即经由
129                         // 当前方格到达它那里 ) 是否更好,用 G 值作参考。更小的 G
130                         // 值表示这是更好的路径
131                         int tG = pNode->G + ptMask[i][2];
132                         if(tG < pChildNode->G) {
133                             pChildNode->pParent = pNode;
134                             pChildNode->G = tG;
135                             pChildNode->H = 10 * (abs(pTarget->pt.X - pt.X) + abs(pTarget->pt.Y - pt.Y));
136                             pChildNode->F = pChildNode->G + pChildNode->H;
137                         }
138                     }
139                 }
140             }
141         }
142     }
143     if(NULL != pTarget->pParent) {
144         MapNode* pNode = pTarget;
145         std::cout << "path is : " << std::endl;
146         do {
147             std::cout << "pt[" << pNode->pt.X << ", " << pNode->pt.Y << "] ->" << std::endl;
148             pNode = pNode->pParent;
149         } while(*pNode != *pStart);
150         std::cout << "pt[" << pNode->pt.X << ", " << pNode->pt.Y << "]" << std::endl;
151     }
152 }
153
154 int main() {
155
156     pathFinding();
157
158     system("pause");
159
160     return 0;
161 }
时间: 2024-12-28 00:00:01

A* 寻路算法学习的相关文章

A*寻路算法入门(一)

大熊猫猪·侯佩原创或翻译作品.欢迎转载,转载请注明出处. 如果觉得写的不好请告诉我,如果觉得不错请多多支持点赞.谢谢! hopy ;) 免责申明:本博客提供的所有翻译文章原稿均来自互联网,仅供学习交流之用,请勿进行商业用途.同时,转载时不要移除本申明.如产生任何纠纷,均与本博客所有人.发表该翻译稿之人无任何关系.谢谢合作! 该篇博客由iOS课程团队的Johann Fradj发布,他现在是一个全职开发iOS的开发者.他是Hot Apps Factory(其是App Cooker的创造者)的共同创建

A*寻路算法的优化与改进

提要 通过对上一篇A*寻路算法的学习,我们对A*寻路应该有一定的了解了,但实际应用中,需要对算法进行一些改进和优化. Iterative Deepening Depth-first search- 迭代深化深度优先搜索 在深度优先搜索中一个比较坑爹情形就是在搜索树的一枝上没有要搜的结果,但是却非常深,甚至深不见底,这样就根本搜索不到结果.为了防止这种情况出现,就出现了Iterative Deepening的思想. 迭代深化搜索(Iterative deepening search, IDS)或者

js实现A*寻路算法

这两天在做百度前端技术学院的题目,其中有涉及到寻路相关的,于是就找来相关博客进行阅读. 看了Create Chen写的理解A*寻路算法具体过程之后,我理解A*算法的原理,不得不说作者写的很好,通熟易懂,图片也做的很好,可见作者在这上面是花了心思的.如果让我写,我是写不来这么好的. 唯一的不足就是,因为我学的是js,因此最后给我的源码我是用不了的......因此才有自己写一篇的打算,方面学习js人的学习.然而前面的描述我就借用他的了,因为如果然我的表达能力实在是太渣了. 简易地图 如图所示简易地图

如何在Cocos2D游戏中实现A*寻路算法(一)

大熊猫猪·侯佩原创或翻译作品.欢迎转载,转载请注明出处. 如果觉得写的不好请告诉我,如果觉得不错请多多支持点赞.谢谢! hopy ;) 免责申明:本博客提供的所有翻译文章原稿均来自互联网,仅供学习交流之用,请勿进行商业用途.同时,转载时不要移除本申明.如产生任何纠纷,均与本博客所有人.发表该翻译稿之人无任何关系.谢谢合作! 该篇博客由iOS课程团队的Johann Fradj发布,他现在是一个全职开发iOS的开发者.他是Hot Apps Factory(其是App Cooker的创造者)的共同创建

算法学习笔记

对于一个软件人员来说,算法和数据结构是无法逃避的,越是逃避说明越是需要继续学习和巩固.加深.转载一篇github上有关算法的文章,以便于进行继续学习和理解.当然并不是说非得全部掌握所有算法至少达到需要的时候会找,找到了会使,使完了能明白是什么东西才能更好的进行coding.这篇文章是有关C的 下次再弄个Java语言的算法部分.学无止境嘛,不能光看java也要学习学习C 学习方法 把所有经典算法写一遍 看算法有关源码 加入算法学习社区,相互鼓励学习 看经典书籍 刷题 原文地址:https://gi

如何在Cocos2D游戏中实现A*寻路算法(八)

大熊猫猪·侯佩原创或翻译作品.欢迎转载,转载请注明出处. 如果觉得写的不好请告诉我,如果觉得不错请多多支持点赞.谢谢! hopy ;) 免责申明:本博客提供的所有翻译文章原稿均来自互联网,仅供学习交流之用,请勿进行商业用途.同时,转载时不要移除本申明.如产生任何纠纷,均与本博客所有人.发表该翻译稿之人无任何关系.谢谢合作! 就拿上图中左上角的情况举个栗子. 这只猫咪想要从原点(O)到左下角的对角线方块中去.如果在左边或底下(或全部都有)有墙壁并且测试穿过对角线将会切入一个墙角(或2个).所以左下

A*寻路算法的探寻与改良(二)

A*寻路算法的探寻与改良(二) by:田宇轩                                                     第二部分:这部分内容主要是使用C语言编程实现A*,想了解A*算法的优化内容的朋友们可以跳过这部分并阅读稍后更新的其他内容 2.1 回顾 在我的上一篇文章中,我们通过抽象的思维方式得出了A*算法的概念和原理,这一章内容中主要探讨如何用编程实现A*算法. 在数据结构与算法的学习中,每个算法都应该结合一定的数据结构在计算机中存储,然后用对应的函数操控这些

A星寻路算法-Mind&amp;Hand(C++)

//注1:Mind & Hand,MIT校训,这里指的理解与实现(动脑也动手) //注2:博文分为两部分:(1)理解部分,为参考其他优秀博文的摘要梳理:(2)代码部分,是C++代码实现的,源码来源GitHub开源代码. 一.理解部分 我一名2018级的Postgraduate新生,路径规划算法的初学者,这里的理解主要参照资深IT博主"莫水千流"的博客原文(链接附在本部分内容的结尾处),做一些梳理和笔记摘要,加深对于A星寻路算法的理解.学习从模仿开始. (1)建立模型,简化问题

5 X 5 方阵引出的寻路算法 之 路径遍历(完结)

??此篇文章源自对一个有趣问题的思考,在我的另一篇博文<一个有趣的 5 X 5 方阵一笔画问题>中有详细介绍.在已知其结论的情况下,作为程序员的我,还是想利用该问题当做出发点,写一个可以遍历所有"可能路线"的寻路算法,当做学习"图"相关算法的练习.如果对那个原始问题有兴趣,点击上面的文章链接,出门右转便是. 一.问题回顾 ??还是要简单描述一下问题:有一个 5 X 5 的点方阵,如下图,要想用一笔画将所有的蓝色点连起来,是否有可行路线.需要满足3点要求: