A星

一、搜索区化为二维数组。

节点被标记为可通过和不可通过。路径找到,就从一个节点向另一个。依次循环,直到目的地。

二、方法:从点A开始,检查相邻节点,向外扩展
    1、从A开始,把它作为待处理点存入“开启列表”
    2、寻找起点周围所有可通过的节点,也把它们加入开启列表。定义A为“父方格”。
    3、从开启列表中删除点A,加入“关闭列表”,关闭列表保存不需要再次检查的节点。
    4、选择开启列表中的临近节点。F=G+H,其中含义为:
       1)G=A沿着产生的路径移动到指定节点的耗费
       2)H=从那个节点移动到B的预估移动耗费,称为“启发式”,是个估计值
   5、路径是通过反复遍历开启列表中并选择最小F值生成。
       1)G值,令水平或垂直移动耗费为10,对角线方向耗费为14(即10根号2)
       2)H值,曼哈顿法。10*(x2-x1+y2-y1).
   6、选择F最小的节点。并:
       1)把此节点从开启列表中删除,加到关闭列表中,作为新的父节点。
       2)检查所有相邻节点,跳过已在关闭列表中的,把可通过的加入开启列表中。
       3)若某个相邻节点已在开启列表中,再次检查路径。即若用新路径到达,G值是否更低。

          若不是,继续;若是,改此节点为父节点,重新计算F值和G值。

   7、确定路径:从目的节点开始,走曾经都父节点的路径。

三、思路大致如下: 

首先有一张地图x*y的地图,为了方便,我们让每个点都用一个数字(10*x+y)来表示的话,也就是每个点唯一的属性。

1、定义一个包含点的信息的结构体,包含每个点的G值,F值,x,y坐标,它的父节点的x,y坐标。并定义此结构体型变量的数组,以存储路径。因为每个结构替里都包含了节点和它的父节点,因此我们可以用递归来输出路径。

2、定义一个链表,主要储存开启列表,关闭列表中的点的信息。之所以是链表,是为了对F值进行动态排列,每增加一个F值,我们都可以按一定顺序加入列表中。这样以来,每次的查找都会很方便。

3、此外,我们还需要设计一个将某点插入链表的函数,因为我们要很频繁的变换点的归属表。

4、点的归属表的判断

5、更新表的F值,因为我们要不断做出比较,路径节点不断移动,于是随着G值的改变,F值也会随之改变。

6、判断方向的可行性

7、求出可行方向的点坐标,即下面经常讲到的“新点”。

8、最后写A星主程序

开启列表=关闭列表=NULL——创建开启列表,head节点就是路径的起点,也就是第一个父节点

循环:把父节点从开启列表中删除——判断是否到达终点——是,break,跳出while

                                                  ——否——从右,下,左,上四个方向判断哪个方向可通过——得到一个可通过方向——计算一个新节点——判断在哪个列表中,可以用flag来标记

                                              ——都不在,则加入开启列表

                                              ——在开启列表,比较他们的F值,更新

                                              ——在关闭列表,比较他们的F值,更新,转移到开启列表

——将父节点加入到关闭列表中——判断开启列表是否为空——否,则将刚刚的新节点又作为父节点赋值给起点坐标——回到循环开头

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值