Java A* 算法

来源:互联网 发布:房屋买卖有哪些软件 编辑:程序博客网 时间:2024/05/16 12:15

a start 从这篇教程学的 

作者是个很细心的人 讲得很细

http://www.cnblogs.com/alamiye010/archive/2009/06/17/1505339.html


package ljh.game.geom;import java.util.ArrayList;import java.util.Arrays;import java.util.List;public class AStarFinder {public class Node{public Node(int x,int y){this.x = x;this.y = y;}public int x,y;public Node parent;public int G;public int H;public int F;public boolean equals(int x,int y){return this.x==x&&this.y==y;}}/** * 开闭 集合 */public ArrayList<Node> OpenList = new ArrayList<AStarFinder.Node>();public ArrayList<Node> CloseList = new ArrayList<AStarFinder.Node>();/** * 方向 */private final static int[] XMove = {0,-1,0,1,-1,-1,1,1};private final static int[] YMove = {-1,0,1,0,1,-1,-1,1};/** * @param map 地图 数据 * @param sx  开始 x 坐标 * @param sy  开始 y 坐标 * @param ex  结束 x 坐标 * @param ey  结束 y 坐标 * @param isPass  可通过的 数据集 * @return 路线 */public ArrayList<Node> find(int[][] map,int sx,int sy,int ex,int ey,int[] isPass){Node start = new Node(sx,sy);Node end = new Node(ex, ey);Node node = start;CloseList.add(node);boolean flag=true;while(flag){for(int i=0;i<4;i++){int fx = node.x+XMove[i];int fy = node.y+YMove[i];if(fx >=map.length &&fy>=map[0].length){continue;}if(end.equals(fx, fy)){end.parent = node;flag = false;break;}if(containClose(fx, fy)){continue;}if(containOpen(fx, fy)){Node node3 = getOpen(fx, fy);if(node.G + 10 < node3.G){node3.parent = node;node3.G =node.G + 10;node3.F = node3.G + node3.H;}continue;}if(Arrays.binarySearch(isPass,map[fy][fx]) >= 0){Node node2 = new Node(fx, fy);node2.parent = node;node2.G = node.G + 10;//采用manhattan启发算法  两点中的直角 距离node2.H = Math.abs((ex-fx+ey-fy)*10);node2.F = node2.G + node2.H;OpenList.add(node2);}}if(flag==false){break;}if(OpenList.size()==0){return null;}node = MinF(OpenList);OpenList.remove(node);CloseList.add(node);}ArrayList<Node> Path = new ArrayList<AStarFinder.Node>();node = end;while(node.parent!=null){Path.add(node);node = node.parent;}return Path;}public Node MinF(List<Node> list){Node min= list.get(0);for(int i = 0; i<list.size();i++){if(list.get(i).F<=min.F){min = list.get(i);}}return min;}public boolean containOpen(int x,int y){for(Node node : OpenList){if(node.equals(x,y)){return true;}}return false;}public Node getOpen(int x,int y){for(Node node : OpenList){if(node.equals(x,y)){return node;}}return null;}public boolean containClose(int x,int y){for(Node node : CloseList){if(node.equals(x,y)){return true;}}return false;}}

原创粉丝点击