算法思想:从起点开始慢慢探索周围的点,直到看到终点。和dijkstra算法一样,整个图是慢慢被探索的,所以也需要定义两个集合,一个是已经处理(探索)过的点的集合,另一个是待处理的点的集合(“待处理的点的集合”并不等于“未处理过的点的集合”,前者指的是已经看到但未处理的点,后者还包括那些在远处尚未看到的点)。
A*算法的核心公式是F(起点到终点的距离)=G(起点到当前点的距离,即已经走过的路)+H(当前点到终点的距离,即还没走过的路)。最开始的时候,程序只能看到起点,此时将起点的G值设置为0,H值设置为起点到终点的距离,H值可以采用欧式距离,也可以采用曼哈顿距离。
与dijkstra算法不同的是,dijkstra每次需要从一个待处理的点的集合里找一个距离起点最近(distance值最小)的点出来进行处理,考虑的仅仅是G值,而A*算法不但要考虑G值,而且要考虑H值,于是有了F=G+H,每次从待处理的点的集合里找F值最小的点,进行处理。
这里的H值是一个估计值(因为当前点到终点之间可能有障碍物,距离到底是多少,暂时无法知道),所以这个算法被称为启发式搜索,和盲目搜索是有区别的。
数据结构如下,这里只做简单演示,实际应用程序的点的个数肯定不止这么多,要用malloc或者new动态申请内存。偷个懒,使用了一些全局变量,避免在函数之间传递参数。
#include <windows.