代码小记

 #include <iostream>
#include <list> struct POINT {
int X;
int Y;
}; // G: 起点到当前点的成本
// H: 当前点到终点的估算成本
// F: G,H之和
struct MapNode {
int G;
int H;
int F;
bool can_pass;
POINT pt;
MapNode* pParent; MapNode() : G(), H(), F(), can_pass(false), pParent(NULL) {} bool operator==(const MapNode& other) {
return (other.pt.X == pt.X && other.pt.Y == pt.Y);
} bool operator!=(const MapNode& other) {
return !(*this == other);
}
}; bool nodeCompare(MapNode* p1, MapNode* p2) {
return (p1->F < p2->F);
} int maps[][] = {
,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,
,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,
,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,
,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,
,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,
,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,
,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,
,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,
,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,
,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,
,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,
,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,
,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,
,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,
,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,
,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,
,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,
,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,
,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,
,,,,,,,,,,,,,,,,,,,,,,,,,,,,,
}; MapNode* findNode(std::list<MapNode*>& nodes, const POINT& pt) {
for(std::list<MapNode*>::iterator it = nodes.begin();
it != nodes.end();
++it) {
if((*it)->pt.X == pt.X && (*it)->pt.Y == pt.Y) {
return *it;
}
}
return NULL;
} void pathFinding() {
std::list<MapNode*> all;
std::list<MapNode*> open;
std::list<MapNode*> close; for(int row=; row<; ++row) {
for(int col=; col<; ++col) {
MapNode* pNode = new MapNode;
pNode->pt.X = row;
pNode->pt.Y = col;
pNode->can_pass = (maps[row][col] == ? true : false);
all.push_back(pNode);
}
} POINT pt_start = {, };
POINT pt_target = {, };
MapNode* pStart = findNode(all, pt_start);
MapNode* pTarget = findNode(all, pt_target); open.push_back(pStart);
while(!open.empty()) {
open.sort(nodeCompare);
MapNode *pNode = open.front();
if (*pNode == *pTarget) {
break;
}
open.pop_front();
close.push_back(pNode);
// 查找周围节点并将合适的加入open
int ptMask[][] = { // x坐标相对位置,y坐标相对位置,移动耗费
{-, -, }, // 左上
{ , -, }, // 正上
{ , -, }, // 右上
{-, , }, // 正左
{ , , }, // 正右
{-, , }, // 左下
{ , , }, // 正下
{ , , } // 右下
};
for(int i=; i<; ++i) {
POINT pt;
pt.X = pNode->pt.X + ptMask[i][];
pt.Y = pNode->pt.Y + ptMask[i][]; if(pt.X > && pt.X < && pt.Y > && pt.Y < ) {
MapNode* pChildNode = findNode(all, pt);
if(!pChildNode->can_pass || NULL != findNode(close, pt)) {
// 如果pNodeLT不可抵达的或者它在 close list 中,忽略它
} else {
if(NULL == findNode(open, pt)) {
// 如果pNodeLT不在 open list 中,把它加入 open list,
// 并且把当前方格设置为它的父亲,记录该方格的F,G和H值
pChildNode->pParent = pNode;
pChildNode->G = pChildNode->pParent->G + ptMask[i][];
pChildNode->H = * (abs(pTarget->pt.X - pt.X) + abs(pTarget->pt.Y - pt.Y));
pChildNode->F = pChildNode->G + pChildNode->H;
open.push_back(pChildNode);
} else {
// 如果pNodeLT已经在 open list 中,检查这条路径 ( 即经由
// 当前方格到达它那里 ) 是否更好,用 G 值作参考。更小的 G
// 值表示这是更好的路径
int tG = pNode->G + ptMask[i][];
if(tG < pChildNode->G) {
pChildNode->pParent = pNode;
pChildNode->G = tG;
pChildNode->H = * (abs(pTarget->pt.X - pt.X) + abs(pTarget->pt.Y - pt.Y));
pChildNode->F = pChildNode->G + pChildNode->H;
}
}
}
}
}
}
if(NULL != pTarget->pParent) {
MapNode* pNode = pTarget;
std::cout << "path is : " << std::endl;
do {
std::cout << "pt[" << pNode->pt.X << ", " << pNode->pt.Y << "] ->" << std::endl;
pNode = pNode->pParent;
} while(*pNode != *pStart);
std::cout << "pt[" << pNode->pt.X << ", " << pNode->pt.Y << "]" << std::endl;
}
} int main() { pathFinding(); system("pause"); return ;
}

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

  1. Unity实现A*寻路算法学习2.0

    二叉树存储路径节点 1.0中虽然实现了寻路的算法,但是使用List<>来保存节点性能并不够强 寻路算法学习1.0在这里:https://www.cnblogs.com/AlphaIcaru ...

  2. Unity实现A*寻路算法学习1.0

    一.A*寻路算法的原理 如果现在地图上存在两点A.B,这里设A为起点,B为目标点(终点) 这里为每一个地图节点定义了三个值 gCost:距离起点的Cost(距离) hCost:距离目标点的Cost(距 ...

  3. cocos2d-x学习日志(13) --A星寻路算法demo

    你是否在做一款游戏的时候想创造一些怪兽或者游戏主角,让它们移动到特定的位置,避开墙壁和障碍物呢?如果是的话,请看这篇教程,我们会展示如何使用A星寻路算法来实现它! A星算法简介: A*搜寻算法俗称A星 ...

  4. js实现A*寻路算法

    这两天在做百度前端技术学院的题目,其中有涉及到寻路相关的,于是就找来相关博客进行阅读. 看了Create Chen写的理解A*寻路算法具体过程之后,我很快就理解A*算法的原理.不得不说作者写的很好,通 ...

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

    A*寻路算法的探寻与改良(二) by:田宇轩                                                     第二部分:这部分内容主要是使用C语言编程实现A*, ...

  6. A*寻路算法的探寻与改良(一)

    A*寻路算法的探寻与改良(一) by:田宇轩                                                                    第一部分:这里我们主 ...

  7. A*寻路算法lua实现

    前言:并在相当长的时间没有写blog该,我觉得有点"颓废"该,最近认识到各种同行,也刚刚大学毕业,我认为他们是优秀的.认识到与自己的间隙,有点自愧不如.我没有写blog当然,部分原 ...

  8. [笔记]A*寻路算法初探

    写在开始之前 最近突然对各路游戏的寻路算法很感兴趣,于是去学习了下游戏里的AI们是如何寻路的.网上相关内容很多,但同时有些说法也不一,制作自己的A* 算法时也有因不同的说法而困惑.整理多方资料并自己实 ...

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

    大熊猫猪·侯佩原创或翻译作品.欢迎转载,转载请注明出处. 如果觉得写的不好请告诉我,如果觉得不错请多多支持点赞.谢谢! hopy ;) 免责申明:本博客提供的所有翻译文章原稿均来自互联网,仅供学习交流 ...

随机推荐

  1. UISearchDisplayController UISearchBar

    分组表+本地搜索 UISearchDisplayController  UISearchBar 的使用 效果图 @interface CityListViewController :UIViewCon ...

  2. jQuery判断浏览器类型

    if ($.browser.msie) { alert("IE浏览器"); } else if ($.browser.opera) { alert("opera浏览器&q ...

  3. 谷歌Volley网络框架讲解——BasicNetwork类

    谷歌Volley网络框架讲解——BasicNetwork类 这个类是toolbox工具箱包里的,实现了Network接口. 先来看下Network这个interface,performRequest( ...

  4. 伪ajax上传文件

    伪ajax上传文件   最近在折腾伪ajax异步上传文件. 网上搜索了一下,发现大部分方法的input file控件都局限于form中,如果是在form外的呢? 必须动态生成一个临时form和临时if ...

  5. JAVA小知识点-Finally和Return的执行关系

    如果Try和Catch中存在return语句的时候Finally内的语句是否会执行,执行的时候对结果又有什么影响呢?我写了个例子来试验这个问题: public static Map<String ...

  6. sql连接查询 2011-10-10 23:13 (QQ空间)

    在关系数据库管理系统中,表建立时各数据之间的关系不必确定,常把一个实体的所有信息存放在一个表中,通过连接运算符可以实现多个表查询.连接是关系数据库模型的主要特点,也是它区别于其它类型数据库管理系统的一 ...

  7. Hackers’ Crackdown-----UVA11825-----DP+状态压缩

    题目地址:http://uva.onlinejudge.org/index.php?option=com_onlinejudge&Itemid=8&page=show_problem& ...

  8. Standford机器学习 聚类算法(clustering)和非监督学习(unsupervised Learning)

    聚类算法是一类非监督学习算法,在有监督学习中,学习的目标是要在两类样本中找出他们的分界,训练数据是给定标签的,要么属于正类要么属于负类.而非监督学习,它的目的是在一个没有标签的数据集中找出这个数据集的 ...

  9. MySQL索引类型

    一.简介 MySQL目前主要有以下几种索引类型:1.普通索引2.唯一索引3.主键索引4.组合索引5.全文索引 二.语句 CREATE TABLE table_name[col_name data ty ...

  10. 办理卡尔加里大学(本科)学历认证『微信171922772』calgary学位证成绩单使馆认证University of calgary

    办理卡尔加里大学(本科)学历认证『微信171922772』calgary学位证成绩单使馆认证University of calgary Q.微信:171922772办理教育部国外学历学位认证海外大学毕 ...