寻路

首先要理解什么是A*寻路算法,可以参考这三篇文章:

下面为测试地图,0表示可以通行,1表示障碍物:

要从点(5, 1)到点(5, 5),通过A*寻路算法找到以路径为@所示:

在代码中可以修改障碍物,起点和终点来测试算法。

最后代码:

import java.util.ArrayList;

import java.util.List;

public class AStar {

public static final int[][] NODES = {

{ 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, 0, 0, 0, 0, 0 },

{ 0, 0, 0, 1, 0, 0, 0, 0, 0 },

{ 0, 0, 0, 1, 0, 0, 0, 0, 0 },

{ 0, 0, 0, 1, 0, 0, 0, 0, 0 },

{ 0, 0, 0, 0, 0, 0, 0, 0, 0 },

{ 0, 0, 0, 0, 0, 0, 0, 0, 0 },

};

public static final int STEP = 10;

private ArrayList openList = new ArrayList();

private ArrayList closeList = new ArrayList();

public Node findMinFNodeInOpneList() {

Node tempNode = openList.get(0);

for (Node node : openList) {

if (node.F < tempNode.F) {

tempNode = node;

}

}

return tempNode;

}

public ArrayList findNeighborNodes(Node currentNode) {

ArrayList arrayList = new ArrayList();

// 只考虑上下左右,不考虑斜对角

int topX = currentNode.x;

int topY = currentNode.y - 1;

if (canReach(topX, topY) && !exists(closeList, topX, topY)) {

arrayList.add(new Node(topX, topY));

}

int bottomX = currentNode.x;

int bottomY = currentNode.y + 1;

if (canReach(bottomX, bottomY) && !exists(closeList, bottomX, bottomY)) {

arrayList.add(new Node(bottomX, bottomY));

}

int leftX = currentNode.x - 1;

int leftY = currentNode.y;

if (canReach(leftX, leftY) && !exists(closeList, leftX, leftY)) {

arrayList.add(new Node(leftX, leftY));

}

int rightX = currentNode.x + 1;

int rightY = currentNode.y;

if (canReach(rightX, rightY) && !exists(closeList, rightX, rightY)) {

arrayList.add(new Node(rightX, rightY));

}

return arrayList;

}

public boolean canReach(int x, int y) {

if (x >= 0 && x < NODES.length && y >= 0 && y < NODES[0].length) {

return NODES[x][y] == 0;

}

return false;

}

public Node findPath(Node startNode, Node endNode) {

// 把起点加入 open list

openList.add(startNode);

while (openList.size() > 0) {

// 遍历 open list ,查找 F值最小的节点,把它作为当前要处理的节点

Node currentNode = findMinFNodeInOpneList();

// 从open list中移除

openList.remove(currentNode);

// 把这个节点移到 close list

closeList.add(currentNode);

ArrayList neighborNodes = findNeighborNodes(currentNode);

for (Node node : neighborNodes) {

if (exists(openList, node)) {

foundPoint(currentNode, node);

} else {

notFoundPoint(currentNode, endNode, node);

}

}

if (find(openList, endNode) != null) {

return find(openList, endNode);

}

}

return find(openList, endNode);

}

private void foundPoint(Node tempStart, Node node) {

int G = calcG(tempStart, node);

if (G < node.G) {

node.parent = tempStart;

node.G = G;

node.calcF();

}

}

private void notFoundPoint(Node tempStart, Node end, Node node) {

node.parent = tempStart;

node.G = calcG(tempStart, node);

node.H = calcH(end, node);

node.calcF();

openList.add(node);

}

private int calcG(Node start, Node node) {

int G = STEP;

int parentG = node.parent != null ? node.parent.G : 0;

return G + parentG;

}

private int calcH(Node end, Node node) {

int step = Math.abs(node.x - end.x) + Math.abs(node.y - end.y);

return step * STEP;

}

public static void main(String[] args) {

Node startNode = new Node(5, 1);

Node endNode = new Node(5, 5);

Node parent = new AStar().findPath(startNode, endNode);

for (int i = 0; i < NODES.length; i++) {

for (int j = 0; j < NODES[0].length; j++) {

System.out.print(NODES[i][j] + ", ");

}

System.out.println();

}

ArrayList arrayList = new ArrayList();

while (parent != null) {

// System.out.println(parent.x + ", " + parent.y);

arrayList.add(new Node(parent.x, parent.y));

parent = parent.parent;

}

System.out.println("\n");

for (int i = 0; i < NODES.length; i++) {

for (int j = 0; j < NODES[0].length; j++) {

if (exists(arrayList, i, j)) {

System.out.print("@, ");

} else {

System.out.print(NODES[i][j] + ", ");

}

}

System.out.println();

}

}

public static Node find(List nodes, Node point) {

for (Node n : nodes)

if ((n.x == point.x) && (n.y == point.y)) {

return n;

}

return null;

}

public static boolean exists(List nodes, Node node) {

for (Node n : nodes) {

if ((n.x == node.x) && (n.y == node.y)) {

return true;

}

}

return false;

}

public static boolean exists(List nodes, int x, int y) {

for (Node n : nodes) {

if ((n.x == x) && (n.y == y)) {

return true;

}

}

return false;

}

public static class Node {

public Node(int x, int y) {

this.x = x;

this.y = y;

}

public int x;

public int y;

public int F;

public int G;

public int H;

public void calcF() {

this.F = this.G + this.H;

}

public Node parent;

}

}

a 寻路算法 java_A*(也叫A star, A星)寻路算法Java版 | 学步园相关推荐

  1. a 寻路算法 java_A*(也叫A star, A星)寻路算法Java版

    寻路算法有非常多种,A*寻路算法被公觉得最好的寻路算法. 首先要理解什么是A*寻路算法,能够參考这三篇文章: 以下为測试地图.0表示能够通行,1表示障碍物: 要从点(5, 1)到点(5, 5).通过A ...

  2. java 求最大公因数_三种算法求最大公约数——Java实现 | 学步园

    求两个自然数m和n的最大公约数. 连续整除检测: 1. t=min{m,n}: 2. m除以t,如果余数为0,则执行步骤3,否则,执行步骤4: 3. n除以t,如果余数为0,返回t的值作为结果,否则, ...

  3. 算法-------无重复字符的最长子串(Java版)

    题目: 给定一个字符串,请你找出其中不含有重复字符的 最长子串 的长度.示例 1:输入: "abcabcbb" 输出: 3 解释: 因为无重复字符的最长子串是 "abc& ...

  4. cubic算法优化_TCP拥塞控制算法 — CUBIC的补丁(七) | 学步园

    描述 以下是提交者Stephen Hemminger对这个patch的描述: limit delayed_ack ratio to prevent divide error TCP Cubic kee ...

  5. 左神算法:将搜索二叉树转换成双向链表(Java版)

    本题来自左神<程序员代码面试指南>"将搜索二叉树转换成双向链表"题目. 题目 对二叉树的节点来说,有本身的值域,有指向左孩子节点和右孩子节点的两个指针:对双向链表的节点 ...

  6. 左神算法:环形单链表的约瑟夫问题(Java版)

    本题来自左神<程序员面试代码指南>"环形单链表的约瑟夫问题"题目. 题目 据说,著名犹太历史学家 Josephus 有过以下故事: 在罗马人占领乔塔帕特后,39 个犹太 ...

  7. dij算法堆优化_BZOJ 3040 最短路(road) 堆优化Dijkstra | 学步园

    题目大意:最短路. 思路:最短路. 贴一份比较高效的堆优化Dij模板吧. CODE: #include #include #include #include #define _MAX 1000010 ...

  8. 左神算法:如何较为直观地打印二叉树(Java版)

    本题来自左神<程序员代码面试指南>"如何较为直观地打印二叉树"题目. 题目 二叉树可以用常规的三种遍历结果来描述其结构,但是不够直观,尤其是二叉树中有重复值的时候,仅通 ...

  9. 棋盘覆盖算法java_棋盘覆盖问题(算法分析)(Java版)

    1.问题描述: 在一个2k×2k个方格组成的棋盘中,若有一个方格与其他方格不同,则称该方格为一特殊方格,且称该棋盘为一个特殊棋盘.显然特殊方格在棋盘上出现的位置有种情形.因而对任何 k≥0,有4k种不 ...

最新文章

  1. mysql isreg_`Innodb` MySQL中如何优雅的删除大表跑路
  2. dede5.7 GBK 在php5.4环境下 后台编辑器无法显示文章内容
  3. iOS知识小集·NSNumber to NSString出错啦
  4. Android学习——自定义控件(二)
  5. 中国邮政编码.html,全国邮政编码一览表.doc
  6. python基础语法-三大内建数据结构之字典(dict)
  7. 发布服务器 bugzilla, streber 数据库备份方案
  8. 《游戏行业DDoS攻击解决方案》重磅发布
  9. static详解java_java中static作用详解
  10. 斐波那契数的皮萨诺周期
  11. Golang的聊天服务器实践(群聊,广播)(一)
  12. 【Codeforces Round #544 (Div. 3)】K Balanced Teams【线性DP】
  13. 如何制作学术Poster?
  14. 快速做出3D人物动画
  15. 触发器在计算机中的作用,d触发器的原理是什么_d触发器的功能及作用
  16. 《平凡的世界》(书评)
  17. 编程之类的文案_最萌编程高手是这样炼成的
  18. js 获取图片经纬度及写经纬度
  19. 计算机无法识别3.0u盘启动,USB3.0接口不能识别U盘的解决方法
  20. 为K8S集群申请Let‘s Encrypt证书

热门文章

  1. .NET Core 批量重置 Azure Blob Storage 的 mime type
  2. .Net资讯 | 一大波开发者福利来了, 一份微软官方Github上发布的开源项目清单等你签收...
  3. PCB 机器学习(ML.NET)初体验实现PCB加投率预测
  4. 一份来自28岁.NET老程序员的自白
  5. ASP.NET CORE MVC 实现减号分隔(Kebab case)样式的 URL
  6. 【直播 】ASP.NET Core解密底层设计逻辑
  7. Visual Studio 2017 已知问题 Qamp;amp;A
  8. Android之在一个类里面注册Handler发送消息在另外一个类里面接收消息
  9. Android之手机出现已安装了存在签名冲突的同名数据包的原因及解决办法
  10. 中科大镜像源_JETPACK4.4安装软件和备份镜像的方法介绍