题目:假设我们有一个7×5大小的迷宫,如下图所示,绿色格子表示起点,红色的格子表示终点,中间的3个深灰色格子表示障碍物。请找到一条从起点到终点最短的路径。
解题思路:
需要引入两个集合和一个公式,如下:
- openList:可到达的格子;
- closeList:已到达的格子;
- F=G+H;
- G:从起点到当前格子的步数;
- H:在不考虑障碍的情况下,从当前格子到达终点的距离;
- F:总距离,即从起点到当前格子,再从当前格子到达目标格子的距离。
具体步骤:
- 把起点放入openList;
- 检查openList中是否有值,如果没有则无法到达终点,结束寻路;否则找出openList中F值最小的方格作为当前方格;
- 找出当前方格上下左右所有可达的格子,检查他们是否在openList或closeList中。如果不在,则将他们加入openList,计算出相应的G、H、F值,并把当前格子作为它们的“父节点”。
- 检查openList中是否含有终点格子,如果有就结束;没有则回到第二步。
代码实现:
public class AStarSearch {
//迷宫地图
public static final int[][] MAZE={
{
0,0,0,0,0,0,0},
{
0,0,0,1,0,0,0},
{
0,0,0,1,0,0,0},
{
0,0,0,1,0,0,0},
{
0,0,0,0,0,0,0}
};
//每一个格子节点
static class Grid{
public int x;
public int y;
public int g;
public int f;
public int h;
public Grid parent;
public Grid(int x,int y){
this.x=x;
this.y=y;
}
public void initGrid(Grid parent,Grid end){
this