A*算法C++ 简单实现

本文详细介绍了如何使用C++实现经典的A*寻路算法,包括关键步骤、核心代码解析以及应用场景,帮助读者理解A*算法的工作原理及其在路径规划中的应用。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

一. 算法步骤:
1. 初始化图,openlist,closedlist
2. 将起点加入openlist,
3. 在openlist中寻找启发函数值F=G+H最小的节点v,
4. 将v从openlist中删除,
5. 将从openlist中删除的节点v加入closedlist
6. 对于节点v周围的8个节点v1而言:
    如果v1是障碍物或者已经处于closedlist中了,则不做任何处理
    如果v1不在openlist中则将v1加入openlist中
    如果v1已经在openlist中,则比较v1经过v到达起点的代价G1是否比之前的代价G0要小,如果G1大于G0,不做任何处理,如果G1<G0,则将v1的父节点设为v,并更新F=G1+H的值,
7. 如果终点goal也位于openlist中,说明路径已经找到,否则返回步骤3进行循环
8. 如果openlist为空,终点还没有找到,则说明路径不存在
9. 最后从终点gaol通过其父节点回溯,寻找起点到终点的路径。
二. 算法实现

用C++实现A*, 其中包含两个对象,节点对象,及A*路径搜索对象。
节点类可以如下定义:
1. AStarNode:
#include<algorithm>
class AStarNode
{
	public:
	int x; //节点的x坐标
	int y; //节点的y坐标
	int F; // 节点总代价
	int G;  // 节点到起点的代价
	int H;  // 节点到终点的代价
	AStarNode *parent;  // 节点的父节点
	AStarNode & operator=(const AStarNode &node) 
// 重载=号运算符,因为含有指针成员parent,需要进行深拷贝,把parent指向的对象也重新复制一份
	{
		x = node.x;
		y = node.y;
		F = node.F;
		G = node.G;
		H = node.H;
		if (node.parent != NULL)
			parent = new AStarNode(*node.parent);
		else
			parent = NULL;
		return *this;
	}
	void cal_F()
	{
		F = G + H;
	}
	void cal_G(AStarNode* cur_point)
	{
		int tempG
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值