寻路算法有非常多种,A*寻路算法被公觉得最好的寻路算法。

首先要理解什么是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*寻路算法,可以参考这三篇文章: 下面为测试地图,0表示可以通行,1表示障碍物: 要从点(5, 1)到点(5, 5),通过A*寻路算法找到以路径为@所示: 在代码中可以修改障碍 ...

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

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

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

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

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

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

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

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

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

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

  7. SAR成像系列:【9】合成孔径雷达(SAR)成像算法-波数域(omega-K)成像算法[也叫距离徙动(RM)算法](附Matlab代码)

    波数域()成像算法作为本系列的最后一种成像算法介绍.关于SAR成像的其他的各种改进算法就不一一列举了.在实际成像中,万变不离其踪,最主要的是关注成像的几何模型,再根据指标选择不同的基础成像算法,然后进 ...

  8. 程序员的算法趣题:Q13 有多少种满足字母算式的解法(Java版)

    题目说明 所谓字母算式,就是用字母表示的算式, 规则是相同字母对应相同数字,不同字母对应不同数字, 并且第一位字母的对应数字不能是 0. 譬如给定算式 We * love = CodeIQ,则可以对应 ...

  9. 贪吃蛇AI算法中的A star寻路算法

    A*寻路算法 在之前的贪吃蛇游戏比赛里,计算蛇吃食物路径时要用到寻路算法,于是就去了解了一下,以下是我的算法演化过程. 1.简单寻路–按图索骥 我一开始想到的方法就是最简单的:目标在哪个方位就往哪个方 ...

最新文章

  1. 基于机器学习梯度下降优化算法来寻找最佳的线性回归模型
  2. 非洲儿童(南阳oj1036)(馋)
  3. python编写自定义模块_编写和导入自定义模块/类
  4. Day 06 元组,字典,集合
  5. 控件多线程访问的问题
  6. Atitit 网络技术体系图 目录 1. 的三网融合是 1 1.1. 电话网、有线电视网 1 1.2. 计算机网 1 2. 计算机网 1 2.1. 互联网 1 2.2. 局域网 1 3. 第1章 计
  7. 在线留痕阅卷系统功能说明及其演示
  8. Java mail 接受网易126和163邮件时数目不全
  9. 如何彻底删除电脑上的软件
  10. ME3616-OPENCPU完整调试笔记
  11. 2021中国AI产业10大趋势,一分钟看明白 | WAIC2021
  12. 求整型和浮点型绝对值的方法
  13. 高质量程序设计指南:C++/C语言
  14. Java架构师成长之路
  15. 解决el-table固定列在ios系统出现的问题
  16. authorize(权限验证)
  17. 脾胃不好,有哪些在家可以做的暖胃汤方?
  18. 几款特别好看的springboot快速开发模板
  19. IDEA中JAVA代码调试技巧
  20. Rx第三部分--深入序列

热门文章

  1. 电脑联机获取更多主题服务器未响应,高手讲解win10系统联机获取更多主题的修复方法...
  2. ROBOGUIDE软件:机器人输送带上下料虚拟仿真操作方法
  3. 衍架式机器人_桁架(机器人)自动上下料机械手
  4. MATLAB票据识别
  5. 完美收纳特色装饰 日本小两口的56平温馨窝
  6. 【程序源代码】音乐小程序
  7. 数据仓库、数据整合、ETL、ELT和EII之间的区别?
  8. 对凌承芯433M无线收发模块的测试
  9. 早产儿发育迟缓怎么办
  10. Latex报错:Missing $ inserted