在A*寻路中使用二叉堆
2006-07-23 11:33:11 来源:WEB开发网核心提示: 使用指针现在我们有了正确大小的数组,几乎可以开始用来寻路了,在A*寻路中使用二叉堆(6),不过,在进一步的添加或者删除操作之前,这个元素的F值是Fcost(5) = 10,x坐标是openX(5) = 12,我们再看看原始的堆,现在
使用指针
现在我们有了正确大小的数组,几乎可以开始用来寻路了。不过,在进一步的添加或者删除操作之前,我们再看看原始的堆。
现在,它只是个F值的列表,而且已经被正确安排。但是我们忽略了一个重要的元素。是的,我们有一系列的F值按顺序保存在堆里,但是我们没有他们代表哪一格的任何线索。基本上,我们只是知道10是堆中最低的F值。但那指的是那个格子?
为了解决这个问题,我们必须改变数组中元素的值。我们不储存排序好的F值,取而代之的是保存关联到地图网格的唯一标志。我的方法是为每个新加入堆的元素创建一个唯一ID叫做squaresChecked。每次往开启列表中添加新元素,我们给squaresChecked增加1,并把它作为列表中新元素的唯一ID。第一个添加进列表的是#1,第二个是#2,依此类推。
最后,我们把具体的F值存储在单独的一维数组中,我把它叫做 Dcost()。和开启列表相同,我们把它的大小定为(地图宽 x 地图高)。我们同时存储节点的x和y坐标在类似的一维数组中,叫做 openX() 和 openY()。看起来就像下面的图:
尽管这看起来有点复杂,但它和前面讲的堆是相同的。只是储存的信息更多了。
#5元素,有最低的F值10,仍然在堆顶,在一维数组的第一列。不过现在我们在堆里存储它的唯一ID 5,而不是它的F值。换句话说,openList(1) = 5。这个唯一数值用来查找元素的F值,以及地图x和y坐标。这个元素的F值是Fcost(5) = 10,x坐标是openX(5) = 12,y坐标是openY(5) = 22。
更多精彩
赞助商链接