public class point{
//f=g+h; f=总步数 g=从原点到当前点的累加 h=当前点到目标的预估步数(曼哈顿方法)
public int f;
public int g;
public int h;
public int x;
public int y;
public int index;
public point fp;
public point(int ix,int iy)
{
x=ix;
y=iy;
}
public point(int ix,int iy,point pfp)
{
x=ix;
y=iy;
fp=pfp;
}
public void init(int ig, int ih)
{
g=ig;
h=ih;
f=g+h;
}
public void init(int ig){
g=ig;
f=g+h;
}
public void setFather(point p)
{
fp=p;
}
}
import java.util.Vector;
public class ptList{
private point[] pl;//开启列表
private int index = 0;//开启列表指针
private int ENDX;
private int ENDY;
private byte[][] mapflag; //0:未检测 1:开启列表 2:关闭列表
private int[][] mapdata;
private final int addLen = 20;
private final int stepS = 10;
private final int stepL = 14;
private final byte OPEN = (byte)1;
private final byte CLOSE = (byte)2;
private final byte BRICK = (byte)1;
private int w;
private int h;
private point curP;
private boolean find=false;
public ptList(int[][] map){
mapdata = map;
h = map.length;//行高
w = map[0].length;//列宽
mapflag = new byte[h][w];
pl = new point[20];
}
public void cleanList(){
for(int i = 0; i < h; i++){
for(int j = 0; j < w; j++){
mapflag[i][j] = 0;
}
}
for(int i = 0; i <= index; i++){
if(pl[i]!=null){
pl[i].fp=null;
pl[i] = null;
}
}
index = 0;
find=false;
}
public Vector GO(int sx, int sy, int ex, int ey){
addOP(sx, sy);
ENDX = ex;
ENDY = ey;
while(!find){
curP = pop();
System.gc();
if(curP==null)
{
System.out.println("开启列表已空,找不到路径!");
return null;
}
addCP(curP);
}
return getResult();
}
private Vector getResult(){
Vector result = new Vector();
while(curP!=null)
{
result.addElement(curP);
curP=curP.fp;
}
return result;
}
private void addCP(point p){
mapflag[p.y][p.x] = CLOSE;
for(int j = p.y - 1; j <= p.y + 1; j++)
{
for(int i = p.x - 1; i <= p.x + 1; i++){
if(i == ENDX && j == ENDY){
System.out.println("FIND!");
curP = new point(i, j,curP);
find=true;
return;
}
addOP(i, j);
}
}
}
private void addOP(int x, int y)//
{
if(x < 0 || y < 0 || x >= w || y >= h || mapflag[y][x] == CLOSE || mapdata[y][x] == BRICK)//over the border/in close list//is brick
{
return;
}
if(mapflag[y][x] == OPEN){
point p = findP(x, y);
if(p != null){
checkg(p);
}else{
System.out.println("错误:开启列表中未发现寻找点!");
}
}else{
mapflag[y][x] = OPEN;
point tmp = null;
if(index >= pl.length)
externList(pl);
if(curP == null){
tmp = new point(x, y);
curP = tmp;
}else{
tmp = new point(x, y, curP);
int step = getStep(tmp);
tmp.init(step + curP.g, (Math.abs(ENDX - x) + Math.abs(ENDY - y)) * stepS);
}
index++;
pl[index] = tmp;
sortList();
}
}
private void showList()
{
System.out.println("OpenList:");
for(int i=1;i<=index;i++){
System.out.println(pl[i].fp.x+"===="+pl[i].fp.y);
}
System.out.println();
}
private point findP(int x, int y){
for(int i = 1; i <= index; i++){
if(pl[i].x == x && pl[i].y == y){
pl[i].index=i;
return pl[i];
}
}
return null;
}
private void checkg(point p){
int newg = getStep(p) + curP.g;
if(newg < p.g){
p.setFather(curP);
p.init(newg);
sortList(p.index);
}
}
private void sortList(int indexI){
int i = indexI / 2;
point temp = null;
while(i > 0){
if(pl[indexI].f <
pl[i].f){
temp = pl[i];
pl[i] = pl[indexI];
pl[indexI] = temp;
}
i /= 2;
}
}
private void sortList(){
int i = index / 2;
point temp = null;
while(i > 0){
if(pl[index].f < pl[i].f){
temp = pl[i];
pl[i] = pl[index];
pl[index] = temp;
}
i /= 2;
}
}
public point pop(){
if(index == 1)
{
index--;
return pl[1];
}else if(index ==0)
{
return null;
}
point pop = pl[1];
point temp = null;
pl[1] = pl[index];
pl[index] = null;
index--;
int i = 2;
while(i <= index){
if(i + 1 < index){//if the current point has two chirlden
if(pl[i].f < pl[i + 1].f){
if(pl[i >> 1].f > pl[i].f){
temp = pl[i];
pl[i] = pl[i >> 1];
pl[i >> 1] = temp;
i <<= 1;
}else
break;
}else{
if(pl[i >> 1].f > pl[i + 1].f){
temp = pl[i + 1];
pl[i + 1] = pl[i >> 1];
pl[i >> 1] = temp;
i = (i + 1) << 1;
}else
break;
}
}else// if the current point has one chirld
{
if(pl[i >> 1].f > pl[i].f){
temp = pl[i];
pl[i] = pl[i >> 1];
pl[i >> 1] = temp;
i <<= 1;
}else
{
break;
}
}
}
return pop;
}
public int getStep(point p)//是否相邻
{
if(curP.x - p.x == 0 || curP.y - p.y == 0)
return stepS;
return stepL;
}
public void externList(point[] pl){
point[] plt = new point[pl.length + addLen];
System.arraycopy(plt, 0, pl, 0, pl.length);
pl = plt;
}
}