迷宫问题:
一张地图上有若干障碍物,表示不能通过。给定起点和终点,要求找到一条从起点到终点的路径。
抽象:
把地图抽象为n*m的布尔矩阵。true表示可以通过,false表示不能通过。
算法思路:
- 维护两个列表,open和close。
- 从起点开始,先将起点加入open列表。算出其上下左右的位置离终点的距离,并让这些点都指向起点,放入open列表里。将起点放入close列表。
- 选择open列表中距离最短的点,对于其上下左右的位置,如果其既不在open列表中又不在close列表中,则计算其距离,并让这些点都指向选中的点,放入open列表中。刚才选中的点放入close列表中。
- 重复步骤3,直到终点被放入close列表中。
- 从终点开始,查找其指向的点,这样一路追溯到起点,则为一条可行路径。
距离的计算:公式 F = G + H
- F代表预测的通过这个点的路径总长度
- G代表从起点到这个点已经走过的长度。用该点指向的点的G加上1
- H为预测的从该点到终点所需距离。其中一种方法:用两个点之间纵坐标差值的绝对值和横坐标差值的绝对值相加而得(曼哈顿方法)
package a_star;
import java.io.BufferedReader;
import java.io.FileReader;
import java.io.IOException;
import java.util.Iterator;
import java.util.LinkedList;
import java.util.List;
public class SimplePuzzle {
class Position {
int x;
int y;
Position lastPosition;
int pastDistance = 0;
int predictDistance;
Position(int x, int y, Position lastPosition) {
this.x = x;
this.y = y;
this.lastPosition = lastPosition;
if(lastPosition != null)
pastDistance = lastPosition.pastDistance + 1;
predictDistance = Math.abs(endx - x) + Math.abs(endy - y);
}
int