Deprecated: imwpcache\f884414bce24ee67f\f73723ec7b1919fa5::__construct(): Implicitly marking parameter $YECBGYFECGEAFWHA as nullable is deprecated, the explicit nullable type must be used instead in /www/wwwroot/www.chuangxiangniao.com/wp-content/plugins/imwpcache-dist/build/f884414bce24ee67ff73723ec7b1919fa5.php on line 2

Deprecated: imwpcache\f884414bce24ee67f\f73723ec7b1919fa5::__construct(): Implicitly marking parameter $BBWFDDBHHYHDXXAB as nullable is deprecated, the explicit nullable type must be used instead in /www/wwwroot/www.chuangxiangniao.com/wp-content/plugins/imwpcache-dist/build/f884414bce24ee67ff73723ec7b1919fa5.php on line 2
c++怎么实现一个简单的A寻路算法_c++简单A寻路实现方法_创想鸟

c++怎么实现一个简单的A寻路算法_c++简单A寻路实现方法

首先定义节点结构体Node,包含坐标、g值(起点到当前点代价)、h值(启发式估计终点代价)和父指针;采用曼哈顿距离作为启发函数;在A*主循环中维护openList与closedList,每次从openList中选取f=g+h最小的节点扩展,检查邻居并更新代价,若到达终点则回溯路径;最后返回从起点到终点的最短路径序列。

c++怎么实现一个简单的a寻路算法_c++简单a寻路实现方法

实现一个简单的A*(A星)寻路算法,核心是结合Dijkstra的广度优先搜索和启发式函数来找到最短路径。下面是一个基于二维网格地图的C++简单实现方法。

1. 定义节点结构

每个格子看作一个节点,记录其位置、代价和父节点。

struct Node {    int x, y;    int g;          // 从起点到当前点的实际代价    int h;          // 启发函数估计到终点的代价    int f() const { return g + h; } // 总代价    Node* parent;   // 指向父节点,用于回溯路径
Node(int x, int y) : x(x), y(y), g(0), h(0), parent(nullptr) {}bool operator==(const Node& other) const {    return x == other.x && y == other.y;}

};

2. 启发函数与距离计算

使用曼哈顿距离作为启发函数,适合4方向移动。

立即学习“C++免费学习笔记(深入)”;

int heuristic(int x1, int y1, int x2, int y2) {    return abs(x1 - x2) + abs(y1 - y2);}

3. A* 核心逻辑

维护两个列表:openList(待处理)和closedList(已处理)。每次从openList中取出f值最小的节点进行扩展。

#include #include #include 

using namespace std;

Olli.ai
Olli.ai

从web或文件数据快速创建数据可视化

Olli.ai 92
查看详情 Olli.ai

// 地图大小和障碍物定义const int ROW = 5, COL = 5;bool maze[ROW][COL] = {{0, 0, 0, 1, 0},{0, 1, 0, 1, 0},{0, 1, 0, 0, 0},{0, 0, 0, 1, 1},{0, 0, 0, 0, 0}};

vector<Node> getNeighbors(Node node) {int dx[] = {-1, 1, 0, 0};int dy[] = {0, 0, -1, 1};vector neighbors;

for (int i = 0; i x + dx[i];    int ny = node->y + dy[i];    if (nx >= 0 && nx = 0 && ny < COL && !maze[nx][ny]) {        neighbors.push_back(new Node(nx, ny));    }}return neighbors;

}

vector aStar(int start_x, int start_y, int end_x, int end_y) {vector> openList;vector> closedList;Node start = new Node(start_x, start_y);Node end = new Node(end_x, end_y);

start->h = heuristic(start_x, start_y, end_x, end_y);openList.push_back(start);while (!openList.empty()) {    // 找出f最小的节点    auto current_it = min_element(openList.begin(), openList.end(),        [](Node* a, Node* b) { return a->f() f(); });    Node* current = *current_it;    // 到达终点    if (*current == *end) {        vector path;        while (current != nullptr) {            path.push_back(Node(current->x, current->y));            current = current->parent;        }        reverse(path.begin(), path.end());        // 释放内存        for (auto node : openList) delete node;        for (auto node : closedList) delete node;        delete end;        return path;    }    openList.erase(current_it);    closedList.push_back(current);    for (Node* neighbor : getNeighbors(current)) {        // 如果已在closedList,跳过        if (find_if(closedList.begin(), closedList.end(),            [neighbor](Node* n) { return *n == *neighbor; }) != closedList.end()) {            delete neighbor;            continue;        }        int tentative_g = current->g + 1;        auto it = find_if(openList.begin(), openList.end(),            [neighbor](Node* n) { return *n == *neighbor; });        if (it == openList.end()) {            neighbor->g = tentative_g;            neighbor->h = heuristic(neighbor->x, neighbor->y, end_x, end_y);            neighbor->parent = current;            openList.push_back(neighbor);        } else {            Node* existing = *it;            if (tentative_g g) {                existing->g = tentative_g;                existing->parent = current;            }            delete neighbor;        }    }}// 没有找到路径for (auto node : openList) delete node;for (auto node : closedList) delete node;delete end;return {}; // 返回空路径

}

4. 使用示例

调用aStar函数并输出结果。

int main() {    vector path = aStar(0, 0, 4, 4);
if (path.empty()) {    cout << "No path found!" << endl;} else {    cout << "Path found:" << endl;    for (const auto& p : path) {        cout << "(" << p.x << "," << p.y << ") ";    }    cout << endl;}return 0;

}

这个实现虽然简单,但包含了A*的核心思想:g值表示真实代价,h值为启发估计,通过优先队列(这里用vector模拟)选择最优节点扩展。适合学习理解A*原理。

注意:为了简化,上面代码手动管理内存。实际项目建议使用智能指针或直接存储Node对象而非指针。

基本上就这些。

以上就是c++++怎么实现一个简单的A寻路算法_c++简单A寻路实现方法的详细内容,更多请关注创想鸟其它相关文章!

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。
如发现本站有涉嫌抄袭侵权/违法违规的内容, 请发送邮件至 chuangxiangniao@163.com 举报,一经查实,本站将立刻删除。
发布者:程序猿,转转请注明出处:https://www.chuangxiangniao.com/p/1476857.html

赞 (0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
c++中如何实现指针传递函数参数_c++指针传参方法
上一篇 2025年12月19日 01:32:03
c++怎么读写二进制文件_二进制文件读写操作详解
下一篇 2025年12月19日 01:32:17

相关推荐

  • VSCode如何实现AI辅助编程 VSCode Copilot插件的深度使用指南

    github copilot能显著提升编程效率,但需合理使用。1. 安装插件并登录github账号是基础步骤;2. 提供清晰的上下文,如规范命名和详细注释,可提高生成代码的准确性;3. 利用快捷键切换多个建议,筛选最优方案并进行修改;4. 对生成代码必须严格审查,尤其关注安全性与业务逻辑匹配度;5.…

    2026年9月23日
    100
  • 抖音ai分身怎么弄出来?抖音分身在哪里打开

    随着人工智能技术不断发展,其应用已经深入到我们日常生活的诸多领域。作为当前热门的短视频平台之一,抖音也推出了AI分身功能,让用户可以轻松创建属于自己的虚拟形象。本文将为您详细介绍抖音AI分身的操作方法,助您在抖音平台上脱颖而出! 一、了解抖音AI分身 抖音AI分身是一项基于人工智能算法打造的特效功能…

    2026年9月23日
    000
  • Java岗大厂面试百日冲刺 – 日积月累,每日三题【Day25】—— JVM1

    Java岗大厂面试百日冲刺 – 日积月累,每日三题【Day25】—— JVM1Java岗大厂面试百日冲刺 – 日积月累,每日三题【Day25】—— JVM1Java岗大厂面试百日冲刺 – 日积月累,每日三题【Day25】—— JVM1Java岗大厂面试百日冲刺 – 日积月累,每日三题【Day25】—— JVM1

    车票 面试题1:你遇到过哪些OOM情况,什么原因造成的?怎么解决的? 该问题主要针对你遇到的实际问题出发,可以根据你实际遇到过的情况和场景,结合下面每种情况的具体原因和解决方式,整理后回答。 当堆内存(Heap Space)没有足够空间存放新创建的对象时,就会抛出 java.lang.OutOfMe…

    2026年9月23日 • 用户投稿
    000
  • 如何用PhotoPosPro的AI裁剪图片?快速实现智能裁剪的教程

    PhotoPosPro的AI裁剪功能可自动识别图片主体并裁剪边缘,适合快速处理或构图新手。打开图片后,在“Image”或“Tools”菜单中找到“AI Crop”工具,可选裁剪比例或让软件自动判断,点击“Apply”运行AI裁剪。完成后可手动微调裁剪框,满意后保存。若效果不佳,可尝试手动调整、切换A…

    2026年9月23日
    200
  • win11怎么进入BIOS设置界面_win11进入BIOS界面操作教程

    首先通过高级启动选项进入BIOS,适用于无法使用快捷键的情况:打开设置→系统→恢复→立即重新启动→疑难解答→高级选项→UEFI固件设置→重启进入BIOS;其次可在开机时按品牌特定快捷键,如联想按F2或Fn+F2、戴尔F2、惠普ESC、华硕与技嘉Del键;此外部分联想设备支持NOVO按钮,在关机状态下…

    2026年9月23日
    000
  • 超高刷之外还有优秀色彩,这才是高刷 TN 屏该有的体验,HKC 神盾三代 UG25EF 深度评测

    超高刷之外还有优秀色彩,这才是高刷 TN 屏该有的体验,HKC 神盾三代 UG25EF 深度评测超高刷之外还有优秀色彩,这才是高刷 TN 屏该有的体验,HKC 神盾三代 UG25EF 深度评测超高刷之外还有优秀色彩,这才是高刷 TN 屏该有的体验,HKC 神盾三代 UG25EF 深度评测超高刷之外还有优秀色彩,这才是高刷 TN 屏该有的体验,HKC 神盾三代 UG25EF 深度评测

    引言:极致的速度真的能带来体验提升吗 在竞技类游戏中,顶尖选手与普通玩家的差距,有时就取决于毫秒之间的反应。而为了缩短这转瞬即逝的差距,玩家们选择不断升级外设,而厂商则在技术的极限上不断探索。当刷新率从 144Hz 跃升至 240Hz 时,我们感受到了前所未有的流畅;但当这个数字继续攀升,我们不禁要…

    2026年9月23日 • 用户投稿
    100
  • VS Code团队协作:共享配置与规范

    通过共享VS Code配置实现团队协作标准化,1. 使用.settings.json统一编辑器行为;2. 集成Prettier与ESLint确保代码风格一致;3. 通过extensions.json推荐必备插件;4. 忽略私有配置文件避免冲突,提升开发效率。 在团队开发中,保持代码风格一致和开发环境…

    2026年9月23日
    000
  • 苹果官网正版查询系统 iPhone序列号验证正品平台

    苹果官网正品查询入口为https://checkcoverage.apple.com/cn/zh/,输入序列号可验证设备型号、保修状态、购买方式及激活锁等信息,确保设备真实性与安全性。 苹果官网正版查询系统 iPhone序列号验证正品平台在哪里?这是不少网友都关注的,接下来由PHP小编为大家带来苹果…

    2026年9月23日
    000
  • Prestashop分类描述在分页时的显示行为解析与SEO考量

    Prestashop商店中,分类描述通常仅在首个分页页面显示,而在后续分页页面上消失,甚至从第二页返回第一页时也可能不显示。这并非一个技术故障,而是Prestashop的默认行为,且从SEO角度看,只要描述在直接访问的第一页可见,就已满足核心要求,无需在所有分页页面重复显示,以避免潜在的重复内容问题…

    2026年9月23日
    100
  • win11无线网卡突然找不到了怎么办_win11无线网卡消失问题修复方法

    首先检查物理开关和功能键是否禁用无线网卡,再通过重启WLAN服务、重装或更新驱动程序恢复识别,若无效则执行网络重置并检查BIOS设置中无线功能是否启用。 如果您发现Windows 11系统中的无线网卡突然无法被识别或在设备管理器中消失,这通常意味着系统未能正确加载该硬件。以下是解决此问题的步骤: 本…

    2026年9月23日
    000
  • 手把手教你在 Ubuntu16.04 安装 GPU 驱动 + CUDA9.0 + cuDNN7

    手把手教你在 Ubuntu16.04 安装 GPU 驱动 + CUDA9.0 + cuDNN7手把手教你在 Ubuntu16.04 安装 GPU 驱动 + CUDA9.0 + cuDNN7手把手教你在 Ubuntu16.04 安装 GPU 驱动 + CUDA9.0 + cuDNN7手把手教你在 Ubuntu16.04 安装 GPU 驱动 + CUDA9.0 + cuDNN7

    如果你的电脑上安装了 ubuntu 16.04 系统,并且配备了一块 nvidia geforce gpu 显卡,那么不利用它来运行深度学习模型就太可惜了!尽管网上有许多相关教程,但质量参差不齐。本文将详细指导你如何在 ubuntu 16.04 上安装 gpu 显卡驱动、cuda 9.0 和 cud…

    2026年9月23日 • 用户投稿
    000
  • Infinispan中实现并发安全计数器:解决分布式应用中的用户登录统计挑战

    本文探讨了在Infinispan缓存中实现并发安全的用户登录计数问题,当多个用户同时登录时,传统计数方式可能导致数据不一致。文章详细介绍了利用Infinispan提供的分布式计数器、事务机制和版本化操作这三种核心策略,以确保在高并发环境下数据更新的原子性和一致性,为构建健壮的分布式应用提供解决方案。…

    2026年9月23日
    200
  • qq浏览器提示“您要访问的网站存在风险”如何继续_QQ浏览器风险网站强制访问设置

    当QQ浏览器提示网站存在风险时,可选择继续访问、将网站加入白名单或临时关闭安全中心防护。首先在警告页面点击“继续访问”按钮直接进入;其次通过设置→隐私与安全→可信站点添加网址至白名单;最后可临时关闭“安全中心”功能以绕过拦截,但建议访问后重新开启以保障安全。 如果您尝试访问某个网站,但QQ浏览器提示…

    2026年9月23日
    100
  • WooCommerce 新订单邮件:根据运输方式设置回复邮箱

    本文介绍了如何根据 WooCommerce 订单中的运输方式,动态设置新订单邮件的回复邮箱。通过自定义 wp_mail 钩子,可以实现更精细化的邮件管理,将不同运输方式的客户咨询路由到相应的邮箱地址,提高客户服务的效率。 根据运输方式自定义 WooCommerce 新订单邮件回复邮箱 WooComm…

    2026年9月23日
    000
  • win11指纹识别不能用了怎么办_win11指纹识别故障修复方法

    首先重新安装指纹驱动程序,进入设备管理器卸载生物识别设备后扫描硬件改动;接着可更新或回滚驱动程序,确保驱动兼容;检查Windows生物识别服务是否设为自动并已启动;删除原有指纹数据并重新录入;最后运行sfc /scannow命令修复系统文件,重启电脑测试功能。 如果您在使用Windows 11系统时…

    2026年9月23日
    400
  • iPhone自动锁屏时间无法修改怎么办

    一、确认低电量模式是否关闭 当iPhone处于低电量模式时,系统会为了节省电量而强制将自动锁屏时间设定为30秒,并且禁止用户手动更改。因此,若发现无法调节自动锁定时间,首先应检查是否开启了该模式。 操作方法如下: 进入“设置”应用。 点击“电池”选项。 若“低电量模式”处于开启状态,请将其关闭。 关…

    2026年9月23日
    000
  • 通过ALTER DATABASE修改默认字符集解决乱码

    mysql数据库出现乱码通常因字符集设置不正确,解决方法如下:1. 使用alter database修改数据库默认字符集,如utf8mb4;2. 对已有表逐个执行alter table convert to character set修改字符集;3. 修改数据库配置文件(my.cnf或my.ini)…

    2026年9月23日
    300
  • Chrome浏览器怎么查看扩展程序的ID_获取已安装扩展唯一标识符

    1、打开Chrome浏览器,输入chrome://extensions/并回车;2、开启右上角“开发者模式”,即可查看每个扩展下方显示的32位唯一ID;3、在macOS中可通过路径~/Library/Application Support/Google/Chrome/Default/Extensio…

    2026年9月23日
    200
  • 苹果iPhone15 Pro如何隐藏静音铃声图标

    在使用苹果iPhone15 Pro时,不少用户希望进一步提升设备的个性化体验,而隐藏静音铃声图标正是一个简单又实用的小技巧。接下来,就为大家详细介绍实现这一操作的具体流程。 确保系统更新 在开始设置前,请先确认你的iPhone15 Pro已升级至最新的iOS版本。保持系统最新不仅能提升使用流畅度,还…

    2026年9月23日
    100
  • KNIME的AI混合工具怎么用?创建数据工作流的详细操作步骤

    KNIME的AI混合工具是将数据处理、机器学习与深度学习通过可视化拖拽整合的平台,核心在于融合KNIME节点、Python/R脚本及外部框架,实现端到端工作流的构建与优化。 ☞☞☞AI 智能聊天, 问答助手, AI 智能搜索, 免费无限量使用 DeepSeek R1 模型☜☜☜ KNIME的AI混合…

    2026年9月23日
    300

发表回复

登录后才能评论
关注微信