用C++写出A*好算法

引言

孟宇洋:哈哈,上次的缺德地图做出来后,大家都要我们写一个寻路系统,你可得帮帮我啊!
绿幕君:你把那个狄克斯特拉算法改改不就行了吗?(详见:用C++写出狄克斯特拉算法
孟宇洋:不行啊,没那个实力啊(🐶),有了,正好,最近要给缺德地图价格小游戏,敌人AI寻路就交给你了!
绿幕君:听我说谢谢你#……¥&¥%……%@

步入正题

在之前,我们介绍了狄克斯特拉算法,用它来搜索最短路程,可是它有一个 比较致命 的问题,那就是:

它和广搜一样,会没有选择性的进行搜索,从而让时间效率降低
举个栗子:

5
2
6
1
4
3
9
8
7
A
B
C
D
E
F
G

看过上篇文章(狄克斯特拉算法)的小伙伴一定会发现,当它从起点A走到B的时候,它是先选择了权重更低的D,而不是正解E,并且在他退出D之后,也是先选择了C,随后又折腾了半天才找到终点G。效率也喜提O(n*log(n)),果然是
真·高效
微笑中流露着绝望

那。。。。咋整?
气成个锤子
现在,有请我们今天的主角,A*!
请添加图片描述

简单介绍一下这个“NB”的算法

A*,又叫启发式算法,是通过代价来进行搜索的,相当于狄克斯特拉算法的升级版,它和狄克斯特拉算法可不同,狄克斯特拉算法是专门来求最少步数的(毕竟再加个方向的话时间就绷不住了 )
请添加图片描述
A*看了后:
在这里插入图片描述

孟宇洋:赶紧进正题!
OK,安排

A*的代价是怎么计算的

啊这。。。。这个问题问得好!
A*的代价是拿从起点到现在走过多少步加上 预计1 从当前点到终点的距离。

在这里,我们用一种比较简单的方法计算(喜欢用笛卡尔坐标系距离公式计算的请划走,天天就开方开方,他不麻烦么? )
就是用abs(x1-x2)+abs(y1+y2)去计算距离。

到了这,你是不是有点思路了?

代码

leetcode_playground_url:A*算法伪代码

提示

A*算法是起点与重终点距离越近效率越高,所以不建议在太大的地图上用!

尾页

算法参考与《我的第一本算法书》4.9章A*算法
学习视频:bilibili 奇乐编程学院《A*寻路算法详解 #A星 #启发式搜索》
网站学习:A*寻路教程
提示:代码我不直接贴出来是为了让大家先自己写,然后再参考一下,有可能我写的还没有你们写的好,自己学的写的好的,可以把代码发在评论区让我康康~~ (以后有机会再剖析代码原理


  1. 肯定是 不是从这点到终点的实际距离(不然还要啥dfs,bfs,A*,狄克斯特拉算法↩︎

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值