偶然看到最短路劲问题,在游戏、导航等领域都有所应用,觉着挺有意思的,便打算自己也实现一版 。最后选择了高效简洁的A*算法。
A*确实是一个非常优秀的实现,比起迪杰特斯拉、best-first等算法,这里省去1万字的赞美……
A*算法简绍可以看该文:
http://blog.youkuaiyun.com/pi9nc/article/details/8779503
A*的实现却并不复杂,关键第一点:判断当前每一步后,下一步怎么走,一般用一个开集和一个闭集分别来存储下一步待走的格子 和已经走过的格子;第二点:如何判断下一步走哪一个格子,这也是A*的优秀之处,它考虑了走过的距离(成本)和预期将要走的距离(期望),拥有快速有效的寻路能力;此处再省略1万字的赞美……
本文稍加改进,用最小堆来存储下一步可以走的格子,并用倒树(指结点中仅有指向父结点的指针的树,姑且让我这么说吧)来记录路劲。
最小堆参看:http://blog.youkuaiyun.com/abcd_d_/article/details/40379125
总共四各类:
1、MyCompare.java 是一个接口
2、MinHeap.java 泛型最小堆 , 实现参照了java API中的ArrayList ,代码可重用
3、Grid.java格子类,用于记录格子信息和简单操作
4、AStar.javaA* 算法主要逻辑类
上代码:
package com.study.algorithm;
/**
* 比较大小的函数接口
* @author zhangshaoliang
* 2015-5-7下午12:28:12
*/
public in