C++之AStar寻路算法

2023-05-16

仅以记录

有一种算法

名为AStar

它的作用是求图中两点之间的最短路径

“沉迷”该算法的我

自己编写了一个版本

注释虽少

但求传神

代码虽“恶心”

但求理解

#include <iostream>
#include <vector>
#include <algorithm>
using namespace std;
/* run this program using the console pauser or add your own getch, system("pause") or input loop */

int weight = 10;
bool dj = true;

class Map{
	public:
		vector<vector<int>> data;
		int start_x, start_y, end_x, end_y;
		Map(vector<vector<int>> Array, int Start_x, int Start_y, int End_x, int End_y){
			data = Array;
			start_x = Start_x;
			start_y = Start_y;
			end_x = End_x;
			end_y = End_y;
		}
};

class Node{
	public:
		int x, y, G, H;
		vector<pair<int, int>> path;
		Node(int x_pos, int y_pos, int g, int h, vector<pair<int, int>> Path){
			x = x_pos;
			y = y_pos;
			G = g;
			H = h;
			path = Path;
			path.push_back(make_pair(x, y));
		}
		vector<Node> getNeighbor(vector<vector<int>> mapData, int end_x, int end_y){

			int LengthY = mapData.size() - 1;
			int LengthX = mapData[0].size() - 1;
			vector<Node> results;
			if (x != 0 and mapData[y][x - 1] != 0){
				Node WestNode(x - 1, y, G + weight, (abs(x - 1 - end_x) + abs(y - end_y)) * weight, path);
				results.push_back(WestNode);
			}
			if (x != LengthX and mapData[y][x + 1] != 0){
				Node EastNode(x + 1, y, G + weight, (abs(x + 1 - end_x) + abs(y - end_y)) * weight, path);
				results.push_back(EastNode);
			}
			if (y != 0 and mapData[y - 1][x] != 0){
				Node NorthNode(x, y - 1, G + weight, (abs(x - end_x) + abs(y - 1 - end_y)) * weight, path);
				results.push_back(NorthNode);
			}
			if (y != LengthY and mapData[y + 1][x] != 0){
				Node SouthNode(x, y + 1, G + weight, (abs(x - end_x) + abs(y + 1 - end_y)) * weight, path);
				results.push_back(SouthNode);
			}
			if (dj){
				if (x != 0 and y != 0 and mapData[y - 1][x - 1] != 0){
					Node NWNode(x - 1, y - 1, G + weight * 1.4, (abs(x - 1 - end_x) + abs(y - 1 - end_y)) * weight, path);
					results.push_back(NWNode);
				}
				if (x != LengthX and y != 0 and mapData[y - 1][x + 1] != 0){
					Node NENode(x + 1, y - 1, G + weight * 1.4, (abs(x + 1 - end_x) + abs(y - 1 - end_y)) * weight, path);
					results.push_back(NENode);
				}
				if (x != 0 and y != LengthY and mapData[y + 1][x - 1] != 0){
					Node SWNode(x - 1, y + 1, G + weight * 1.4, (abs(x - 1 - end_x) + abs(y + 1 - end_y)) * weight, path);
					results.push_back(SWNode);
				}
				if (x != LengthX and y != LengthY and mapData[y + 1][x + 1] != 0){
					Node SENode(x + 1, y + 1, G + weight * 1.4, (abs(x + 1 - end_x) + abs(y + 1 - end_y)) * weight, path);
					results.push_back(SENode); 
				}
			}
			return results;
		}
		
		bool inList(vector<Node> List){
			for (Node i : List){
				if (i.x == x and i.y == y)
					return true;
			}
			return false;
		}
		
		void changeG(vector<Node> List){
			for (Node i : List){
				if (i.x == x and i.y == y){
					if (i.G > G)
						i.G = G;
				}
			}
		}
};

bool ST(Node x, Node y){
	if (x.G < y.G ) 
		return true;
	return false;
}

vector<pair<int, int>> AStar(Map map_array){
	vector<Node> open_list;
	vector<Node> close_list;
	int start_x, start_y, end_x, end_y;
	start_x = map_array.start_x;
	start_y = map_array.start_y;
	end_x = map_array.end_x;
	end_y = map_array.end_y;
	vector<pair<int, int>> v;
	Node startNode(start_x, start_y, 0, 0, v); 
	close_list.push_back(startNode);
	Node currentNode = startNode;
	vector<Node> Neighbors;
	while (end_x != currentNode.x or end_y != currentNode.y){
		Neighbors = currentNode.getNeighbor(map_array.data, end_x, end_y);
		for (Node i : Neighbors){ 
			if (not (i.inList(close_list))){ // 问题出在这里 

				if (i.inList(open_list)){
					i.changeG(open_list);
				}
				else{
					open_list.push_back(i);
				}
			}
		}

		sort(open_list.begin(), open_list.begin()+open_list.size(), ST);
		currentNode = open_list[0];
		open_list.erase(open_list.begin());
		close_list.push_back(currentNode);
	}

	vector<pair<int, int>> results;
	for (int i=0; i<currentNode.path.size(); i++){
			results.push_back(make_pair(currentNode.path[i].first, currentNode.path[i].second));
	}
	return results;
} 

int main(int argc, char* argv) {
	vector<vector<int>> mymap;
	vector<int> v;
	v.push_back(1);
	v.push_back(1);
	v.push_back(1);
	v.push_back(1);
	v.push_back(1);
	v.push_back(1);
	mymap.push_back(v);
	v.clear();
	v.push_back(1);
	v.push_back(0);
	v.push_back(0);
	v.push_back(0);
	v.push_back(0);
	v.push_back(1);
	mymap.push_back(v);
	v.clear();
	v.push_back(1);
	v.push_back(0);
	v.push_back(1);
	v.push_back(0);
	v.push_back(0);
	v.push_back(1);
	mymap.push_back(v);
	v.clear();
	v.push_back(1);
	v.push_back(0);
	v.push_back(1);
	v.push_back(0);
	v.push_back(1);
	v.push_back(0);
	mymap.push_back(v);
	v.clear();
	v.push_back(1);
	v.push_back(0);
	v.push_back(1);
	v.push_back(0);
	v.push_back(1);
	v.push_back(1);
	mymap.push_back(v);
	v.clear();
	v.push_back(1);
	v.push_back(0);
	v.push_back(1);
	v.push_back(0);
	v.push_back(1);
	v.push_back(1);
	mymap.push_back(v);
	Map map(mymap, 0, 1, 4, 5);
	vector<pair<int, int>> results;
	results = AStar(map);
	for (pair<int, int> p: results){
		int a = p.first;
		int b = p.second;
		cout << "{" << a << ", " << b << "}, ";
	}
	return 0;
	
}

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

C++之AStar寻路算法 的相关文章

  • Keil4打开单片机工程一片空白,cpu100%程序卡死的问题解决

    提示 xff1a 文章写完后 xff0c 目录可以自动生成 xff0c 如何生成可参考右边的帮助文档 文章目录 前言 xff1a 问题描述一 原因二 解决办法1 问题图片2 解决办法 xff1a 删除部分文件 总结 前言 xff1a 问题描
  • CAN协议扩展帧ID

    例如 ID xff1a 0x18102701 扩展帧ID共29位 准换为二进制0001 1000 0001 0000 0010 0111 0000 0001 29位110代表优先级十进制6 xff0c PF十进制16 xff08 16进制0
  • STM32的USART中RTS、CTS的作用和意义

    USART中RX和TX这两个引脚的功能 xff0c 这两个引脚是USART串行通信最常见和必不可少的两个引脚 但我们在手册中会发现关于USART的其他引脚 xff1a USART CK USART RTS USART CTS xff0c 如
  • 步骤一:Jetson Nano安装ROS步骤,及相关错误分析

    安装系统为 xff1a ubantu 18 04 ros melodic 硬件 xff1a jetson nano b01 xff0c 联想拯救者r7000p 内存卡 xff1a SAMSUNG 128G 最后一次更新2022 10 5 亲
  • 步骤三:PX4,Mavros的下载安装及代码测试

    1 安装Mavros sudo apt install ros melodic mavros ros melodic mavros extras 2 安装Mavros相关的 geographiclib dataset 此处已经加了ghpro
  • 步骤五:PIXHAWK遥控器的使用

    采用福斯i6s遥控 1 连接飞控 打开遥控器 xff0c 接收机插上飞控 xff0c 再插上送的短接线 xff0c 进行匹配对码RX 2 遥控器长按两秒锁 xff0c system output mode Output mode按照图片这样
  • 步骤七:激光雷达的驱动安装与建图使用

    大致的步骤可以按照官网来 nbsp Cartographer SLAM for Non GPS Navigation Dev documentation ardupilot org 但是官网的步骤有严重的问题 问题1 报错 libabsl
  • 步骤八:PX4使用cartographer与move_base进行自主建图导航

    首先老样子硬件如下 飞控 HOLYBRO PIXHAWK V4 PX4 机载电脑 jetson nano b01 激光雷达 思岚a2 前提 你已经完成了cartographer建图部分 能够正常输出map话题 前言 由于要参加中国机器人大赛
  • 最详细的流媒体传输协议-rtsp协议详解

    流媒体传输协议 rtsp协议详解 参阅 RTSP协议详解和分析从零开始写一个RTSP服务器 xff08 一 xff09 RTSP协议讲解关于RTSP RTP RTCP协议的深刻初步介绍 rtsp RTSP出现以前 xff0c 最热的大概就是
  • 利用FFmpeg合并音频和视频

    一 FFmpeg 多个音频合并的2种方法 多个mp3文件合并成一个mp3文件 一种方法是连接到一起 ffmpeg64 exe i 34 concat 123 mp3 124 mp3 34 acodec copy output mp3 解释
  • 流媒体服务器之 ZLMediaKit介绍

    流媒体服务器是流媒体应用的核心系统 xff0c 是运营商向用户提供视频服务的关键平台 流媒体服务器的主要功能是对流媒体内容进行采集 缓存 调度和传输播放 流媒体应用系统的主要性能体现都取决于媒体服务器的性能和服务质量 因此 xff0c 流媒
  • WebRTC 教程三:WebRTC特性,调试方法以及相关服务器搭建方法

    WebRTC 教程一 xff1a WebRTC信令 架构和 API 入门 WebRTC 教程二 xff1a WebRTC API 和 Leak 本文是 WebRTC 的第三篇教程 xff0c 主要介绍了 WebRTC 的一些特性 xff0c
  • 能不能在头文件中定义全局变量?

    首先 xff0c 这是一篇科普文 xff0c 所以 比较杂 xff0c 我尽量写清楚一些 1 ANSI C标准是什么 xff1f GNU又是什么 xff1f ld是什么 xff1f ANSI C是C语言的标准规范 xff0c 是国际标准化组
  • FFmpeg转码流程详解

    前言 音视频转码主要指这样的概念 xff1a 容器格式的转换 xff0c 比如MP4转换为MOV 容器中音视频数据编码方式转换 xff0c 比如H264编码转换成MPEG4编码 xff0c MP3换为AAC 音视频码率的转换 xff0c 比
  • FFmpeg 代码实现流媒体推流(RTSP)

    实时录屏并把视频推流到RTSP服务器 xff0c 具体流程是抓取屏幕内容 bitmap xff0c 并把bitmap转化为YUV xff0c 接着把YUV编码成H264 xff0c 再把H264码流推到RTSP服务器 xff1b 把采集到的
  • rtsp协议的理解

    一 rtsp协议概述 RTSP xff08 Real Time Streaming Protocol xff09 实时流传输协议 xff0c 是TCP IP协议体系中的一个应用层协议 该协议定义了一对多的应用程序如何有效地通过IP网络传送多
  • QT 程序打包的方法

    01前言 很多朋友因为要把程序放到不同电脑的环境去测试 xff0c 而又不可能每一台电脑都安装了QT的开发环境 xff0c 于是乎有了将程序打包的想法 这里用来的包的工具是windeployqt xff0c 是QT官方自带的打包软件 xff
  • C++Qt开发——事件处理函数

    事件 event 是由系统或者Qt本身在不同时刻发出的 当用户按下鼠标 敲下键盘 xff0c 或者其它情况时候都会发出一个相应的事件 一些事件在对用户操作做出相应时发出 xff0c 如键盘事件等 xff1b 另外一些则是由系统自动发出 xf
  • C++Qt开发——类图结构

    Qt 类图 系统性地总结一下相关的知识点 xff0c 这里有个网图 xff0c 是Qt的类图 xff0c 看完可以对Qt整体的框架有一个大致的了解 xff0c 具体如下 CSDN QT大纲 xff1a Qt开发必备技术栈学习路线和资料 Qt
  • QT如何实现一个五子棋游戏

    FIR pro QT 43 61 core gui TARGET 61 FIR TEMPLATE 61 app SOURCES 43 61 main cpp widget cpp HEADERS 43 61 widget h wight h

随机推荐

  • Qt5实现UDP通信的示例代码怎么写

    QT5实现UDP通信的示例代码怎么写 xff0c 很多新手对此不是很清楚 xff0c 为了帮助大家解决这个难题 xff0c 下面小编将为大家详细讲解 xff0c 有这方面需求的人可以来学习下 xff0c 希望你能有所收获 前言 该例程经过实
  • OpenCV+Qt实现图像处理操作工具

    一 目标 Qt界面实现 雪花屏 高斯模糊 中值滤波 毛玻璃 灰度化 XY方向模糊 双边模糊 腐蚀 图像处理操作 要求左边原图 xff0c 右边效果图 结果展示如下 xff1a 图像处理实现有点多 xff0c 就不一个一个地展示了 xff0c
  • 链表的建立、赋值、输出、查找、增、删

    include lt stdio h gt include lt string h gt include lt math h gt include lt stdlib h gt typedef struct node 定义结构体 int n
  • 蓝桥杯-串口

    本文通过电脑串口发送文本模式和HEX模式进行介绍串口的简单使用 xff01 注意事项 xff1a 1 本节通过定时器2的串口1 进行串口控制 2 串口如果开启了 编程完成后自动打开串口会导致第一次发送无法看到 xff08 HEX模式 xff
  • GSV2008

    GSV2008 是HDMI2 0 四进二出矩阵 xff0c 自持HDCP2 2 xff0c 支持DOWN SCALER 四个HDMI输入 xff0c 2个HDMI输出 xff0c 自动EQ 应用 xff1a 1 xff0c 功放 ARC C
  • 漏洞挖掘-从任意文件读取漏洞到获取账户利用

    开篇 大家好 xff0c 我是承影战队的v1ct0ry xff0c 这次我为大家分享一次比较有趣的漏洞挖掘经历 这次挖掘过程是以灰盒挖掘为主要思想进行展开 xff0c 不熟悉的读者可以阅读上篇文章熟悉一下 一 任意文件读取 开局我们通过扫描
  • curl命令行工具

    转载 curl 命令行工具的使用及命令参数说明 curl的使用 1 1 URL访问 1 2 表单提交 1 3 其它HTTP请求方法 1 4 文件上传 1 5 HTTPS支持 1 6 添加请求头 1 7 Cookie支持curl语法及选项cu
  • Ubuntu20.4安装ROS系统教程(自用)

    1 Ubuntu各个版本系统对应的ROS版本 1 2Ubuntu16 04与ROS kinetic的安装 1 2 1Ubuntu16 04配置 1 2 2安装ROS kinetic版 1 3Ubuntu18 04和ROS melodic的安
  • UART 空闲中断+DMA接收流程

    在项目中利用UART空闲中断接收外部信号 xff0c 利用DMA接收 xff0c 实现外部到内存的传输 通过分析其它文章的代码 xff0c 大概如下 xff1a span class token comment 配置 DMA Stream
  • 5分钟带你从数据类型了解Java相比C/C++有什么优势

    数据类型是一门语言的血肉 xff0c 通过这5分钟的浏览 xff0c 只学过C C 43 43 的小伙伴会初步了解Java的一些特性 xff0c 学过一点Java的朋友在读完这篇文章后也一定会对Java的语法规范有更深刻的了解 Java数据
  • 备赛电赛学习硬件篇(一):电机部分

    目录 一 电机选型 二 电机的正反转 xff0c 刹车 一 电机选型 1 电机类型 无刷电机较贵 xff0c 但是静音且损耗小 xff0c 由于霍尔元件的特殊性 xff08 不带霍尔需要转速高的时候才可以利用反电动势准确确定转子的位置 xf
  • 【总线】一文看懂RS232和RS485通信总线

    目录 RS232概述 RS232特性 RS485 概述 RS485 特性 RS232 和 RS485 的区别 区别总结 RS232概述 RS 232接口符合电子工业联盟 xff08 EIA xff09 建立的串行数据通信接口标准 原始编号是
  • 【C++学习笔记】vector构造函数

    文章目录 1 vector构造函数说明 xff1a 2 实战 xff1a 2 1 vector构造函数代码示例2 2 输出 3 参考资料 1 vector构造函数说明 xff1a span class token keyword templ
  • 请求报文/相应报文

    一 请求报文分为4个部分 请求行 请求头 请求空行 请求体 1 1 请求行 主要是3个部分 GET 请求方式 1 2 请求地址 所带的参数 demo demo php userName 61 E6 9D 8E E5 9B 9B amp us
  • python+requests——高级用法——auth认证

  • C语言char指针的使用

    在c语言中 xff0c char指针不仅能指向char变量 xff0c 还能指向常量字符串 xff0c 同时也能指向一个char数组的 想要访问单个字符 xff0c 就要通过 来进行解引用 xff0c 若是要访问整个数组或字符串的话 xff
  • HTTP协议的请求格式解析

    HTTP协议是一个使用较多的应用层协议 xff0c 它是一个请求 响应式的一个协议 xff0c 就是我客户端给你发一个请求 xff0c 你客户端需要返回给我一样响应 首先我们来看一下HTTP协议的请求格式 HTTP请求格式 xff1a HT
  • 运行Gazebo+moveit+Rviz,报错,提示无控制器

    在rviz里规划成功后 xff0c 执行显示failed rviz里能规划 xff0c 但是Gazebo里动不了 moveit报错如下 xff1a WARN 1679466487 132361192 26 763000000 Waiting
  • 基于UDP协议搭建的简单客户端与服务器(UDP协议)

    UDP协议 UDP协议的介绍1 UDP的缺点 基于UDP实现的回显服务器基于UDP实现的客户端 UDP协议的介绍 UDP协议特点 xff1a 1 无连接 2 面向数据报 3 不可靠传输 4 全双工 16位源端口号 目的端口号 xff1a 表
  • C++之AStar寻路算法

    仅以记录 有一种算法 名为AStar 它的作用是求图中两点之间的最短路径 沉迷 该算法的我 自己编写了一个版本 注释虽少 但求传神 代码虽 恶心 但求理解 include lt iostream gt include lt vector g