A*

来源:互联网 发布:淘宝上架宝贝时间限制 编辑:程序博客网 时间:2024/04/28 21:26

 

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;
    }
}

原创粉丝点击