java中len(a)_请教一下该怎么用java怎么实现A*算法?

代码实现(Java)1. 输入(1) 代表地图二值二维数组(0表示可通路,1表示路障)int[][] maps = {{0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 },{0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 },{0,0,1,1,0,0,0,0,0,0,1,1,1,0,0 },{0,0,0,1,0,0,0,0,0,1,1,0,0,0,0 },{0,0,0,1,0,0,0,0,1,1,0,0,0,0,0 },{0,0,0,1,0,0,0,0,1,0,0,0,0,0,0 },{0,0,0,1,0,0,0,0,1,0,0,0,0,0,0 }};123456789123456789(2) 按照二维数组的特点,坐标原点在左上角,所以y是高,x是宽,y向下递增,x向右递增,我们将x和y封装成一个类,好传参,重写equals方法比较坐标(x,y)是不是同一个。public class Coord{public int x;public int y; public Coord(int x,int y){this.x = x;this.y = y;} @Overridepublic boolean equals(Object obj){if (obj ==null)return false;if (objinstanceof Coord){Coord c = (Coord) obj;return x == c.x && y == c.y;}return false;}}12345678910111213141516171819202122231234567891011121314151617181920212223(3) 封装路径结点类,字段包括:坐标、G值、F值、父结点,实现Comparable接口,方便优先队列排序。public class Nodeimplements Comparable{ public Coord coord;// 坐标public Node parent;// 父结点public int G;// G:是个准确的值,是起点到当前结点的代价public int H;// H:是个估值,当前结点到目的结点的估计代价 public Node(int x,int y){this.coord =new Coord(x, y);} public Node(Coord coord, Node parent,int g,int h){this.coord = coord;this.parent = parent;G = g;H = h;} @Overridepublic int compareTo(Node o){if (o ==null)return -1;if (G + H > o.G + o.H)return 1;else if (G + H  openList =new PriorityQueue();// 优先队列(升序)List closeList =new ArrayList();1212(3) 定义几个布尔判断方法:最终结点的判断、结点能否加入open表的判断、结点是否在Close表中的判断。/*** 判断结点是否是最终结点*/private boolean isEndNode(Coord end,Coord coord){return coord !=null && end.equals(coord);} /*** 判断结点能否放入Open列表*/private boolean canAddNodeToOpen(MapInfo mapInfo,int x,int y){// 是否在地图中if (x <0 || x >= mapInfo.width || y <0 || y >= mapInfo.hight)return false;// 判断是否是不可通过的结点if (mapInfo.maps[y][x] == BAR)return false;// 判断结点是否存在close表if (isCoordInClose(x, y))return false; return true;} /*** 判断坐标是否在close表中*/private boolean isCoordInClose(Coord coord){return coord!=null&&isCoordInClose(coord.x, coord.y);} /*** 判断坐标是否在close表中*/private boolean isCoordInClose(int x,int y){if (closeList.isEmpty())return false;for (Node node : closeList){if (node.coord.x == x && node.coord.y == y){return true;}}return false;}1234567891011121314151617181920212223242526272829303132333435363738394041424344454612345678910111213141516171819202122232425262728293031323334353637383940414243444546(4) 计算H值,“曼哈顿” 法,坐标分别取差值相加private int calcH(Coord end,Coord coord){return Math.abs(end.x - coord.x) + Math.abs(end.y - coord.y);}12341234(5) 从Open列表中查找结点private Node findNodeInOpen(Coord coord){if (coord ==null || openList.isEmpty())return null;for (Node node : openList){if (node.coord.equals(coord)){return node;}}return null;}123456789101112123456789101112(6) 添加邻结点到Open表/*** 添加所有邻结点到open表*/private void addNeighborNodeInOpen(MapInfo mapInfo,Node current){int x = current.coord.x;int y = current.coord.y;// 左addNeighborNodeInOpen(mapInfo,current, x -1, y, DIRECT_VALUE);// 上addNeighborNodeInOpen(mapInfo,current, x, y -1, DIRECT_VALUE);// 右addNeighborNodeInOpen(mapInfo,current, x +1, y, DIRECT_VALUE);// 下addNeighborNodeInOpen(mapInfo,current, x, y +1, DIRECT_VALUE);// 左上addNeighborNodeInOpen(mapInfo,current, x -1, y -1, OBLIQUE_VALUE);// 右上addNeighborNodeInOpen(mapInfo,current, x +1, y -1, OBLIQUE_VALUE);// 右下addNeighborNodeInOpen(mapInfo,current, x +1, y +1, OBLIQUE_VALUE);// 左下addNeighborNodeInOpen(mapInfo,current, x -1, y +1, OBLIQUE_VALUE);} /*** 添加一个邻结点到open表*/private void addNeighborNodeInOpen(MapInfo mapInfo,Node current,int x,int y,int value){if (canAddNodeToOpen(mapInfo,x, y)){Node end=mapInfo.end;Coord coord =new Coord(x, y);int G = current.G + value;// 计算邻结点的G值Node child = findNodeInOpen(coord);if (child ==null){int H=calcH(end.coord,coord);// 计算H值if(isEndNode(end.coord,coord)){child=end;child.parent=current;child.G=G;child.H=H;}else{child =new Node(coord, current, G, H);}openList.add(child);}else if (child.G > G){child.G = G;child.parent = current;// 重新调整堆openList.add(child);}}}1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606112345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061(7) 回溯法绘制路径private void drawPath(int[][] maps, Node end){if(end==null||maps==null)return;System.out.println("总代价:" + end.G);while (end !=null){Coord c = end.coord;maps[c.y][c.x] = PATH;end = end.parent;}}12345678910111234567891011(8) 开始算法,循环移动结点寻找路径,设定循环结束条件,Open表为空或者最终结点在Close表 public void start(MapInfo mapInfo){if(mapInfo==null)return;// cleanopenList.clear();closeList.clear();// 开始搜索openList.add(mapInfo.start);moveNodes(mapInfo);} /*** 移动当前结点*/private void moveNodes(MapInfo mapInfo){while (!openList.isEmpty()){if (isCoordInClose(mapInfo.end.coord)){drawPath(mapInfo.maps, mapInfo.end);break;}Node current = openList.poll();closeList.add(current);addNeighborNodeInOpen(mapInfo,current);}}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值