用C++写出A*好算法
引言
孟宇洋:哈哈,上次的缺德地图做出来后,大家都要我们写一个寻路系统,你可得帮帮我啊!
绿幕君:你把那个狄克斯特拉算法改改不就行了吗?(详见:用C++写出狄克斯特拉算法)
孟宇洋:不行啊,没那个实力啊(🐶),有了,正好,最近要给缺德地图价格小游戏,敌人AI寻路就交给你了!
绿幕君:听我说谢谢你#……¥&¥%……%@
步入正题
在之前,我们介绍了狄克斯特拉算法,用它来搜索最短路程,可是它有一个 比较致命 的问题,那就是:
它和广搜一样,会没有选择性的进行搜索,从而让时间效率降低
举个栗子:
看过上篇文章(狄克斯特拉算法)的小伙伴一定会发现,当它从起点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*寻路教程
提示:代码我不直接贴出来是为了让大家先自己写,然后再参考一下,有可能我写的还没有你们写的好,自己学的写的好的,可以把代码发在评论区让我康康~~ (以后有机会再剖析代码原理)
肯定是不是从这点到终点的实际距离(不然还要啥dfs,bfs,A*,狄克斯特拉算法) ↩︎