使用Java编写的B*算法
package rpg.stage.path; import java.util.ArrayList;
import java.util.HashSet;
import java.util.Iterator; import rpg.objs.Point; public class BFinding { public BFinding() {
} protected HashSet<Point> openList = new HashSet<Point>();
protected HashSet<Point> leftList = new HashSet<Point>();
protected HashSet<Point> rightList = new HashSet<Point>();
protected HashSet<Point> closeList = new HashSet<Point>(); public synchronized ArrayList<int[]> find(Point start,Point end,boolean canPenetrate){
if(end == null){
return new ArrayList<int[]>();
}
if(start == null){
return new ArrayList<int[]>();
}
end.clear();
start.clear();
openList.clear();
openList.add(start);
leftList.clear();
rightList.clear();
closeList.clear(); int count = 0; while(!openList.isEmpty() || !leftList.isEmpty() || !rightList.isEmpty()){
count ++;
if(count>1000)
break;
Iterator<Point> it = openList.iterator();
if(it.hasNext()){
Point p = it.next();
it.remove();
if(sideNext(p,end,0,canPenetrate))break;
}
it = leftList.iterator();
if(it.hasNext()){
Point p = it.next();
it.remove();
if(sideNext(p,end,1,canPenetrate))break;
}
it = rightList.iterator();
if(it.hasNext()){
Point p = it.next();
it.remove();
if(sideNext(p,end,-1,canPenetrate))break;
}
}
final ArrayList<int[]> list = new ArrayList<int[]>();
while(end.parent!=null){
list.add(0,new int[]{end.x,end.y});
end = end.parent;
}
return list;
} /**
*
* @param p
* @param end 目标点
* @param side 0 direct -1 right 1 left
* @param canPenetrate 可否穿透
*/
protected boolean sideNext(Point p,Point end,int side,boolean canPenetrate){
int dir = Point.getDirSimple(p, end);
Point nextp = null; if(closeList.contains(p)){
nextp = nextPassPointSide(p,end,-1,canPenetrate);
if(nextp != null){
if(nextp == end){
nextp.parent = p;
return true;
}
if(this.closeList.contains(nextp))
// return sideNext(nextp, end, side, canPenetrate);
return false;
else if(!this.leftList.contains(nextp))
addToSearch(p,nextp,this.rightList);
}
nextp = nextPassPointSide(p,end,1,canPenetrate);
if(nextp != null){
if(nextp == end){
nextp.parent = p;
return true;
}
if(this.closeList.contains(nextp))
// return sideNext(nextp, end, side, canPenetrate);
return false;
else if(!this.rightList.contains(nextp))
addToSearch(p,nextp,this.leftList);
}
return false;
}
this.closeList.add(p);
if(side == 0){
if(p.canWalkDir(dir,canPenetrate)){//下一个点可以走
nextp = p.getPassPointByDir(dir);
if(nextp == end){
nextp.parent = p;
return true;
}
if(!this.closeList.contains(nextp)){
addToSearch(p,nextp,this.openList);
}
}
else//不可走,就分支出两个围绕探索点
{
nextp = nextPassPointSide(p,end,-1,canPenetrate);
if(nextp == end){
nextp.parent = p;
return true;
}
if(nextp != null){
if(this.closeList.contains(nextp))
return sideNext(nextp, end, side, canPenetrate);
// return false;
else if(!this.leftList.contains(nextp))
addToSearch(p,nextp,this.rightList);
}
nextp = nextPassPointSide(p,end,1,canPenetrate);
if(nextp == end){
nextp.parent = p;
return true;
}
if(nextp != null){
if(this.closeList.contains(nextp))
return sideNext(nextp, end, side, canPenetrate);
// return false;
else if(!this.rightList.contains(nextp))
addToSearch(p,nextp,this.leftList);
}
}
}
else if(side>0){
nextp = p.getPassPointByDir(dir);
if(nextp == end){
nextp.parent = p;
return true;
}
if(nextp != null && !this.closeList.contains(nextp)){
addToSearch(p,nextp,this.openList);
}
else
{
nextp = nextPassPointSide(p,end,1,canPenetrate);
if(nextp == end){
nextp.parent = p;
return true;
}
if(nextp != null && !this.closeList.contains(nextp) && !this.rightList.contains(nextp)){
addToSearch(p,nextp,this.leftList);
}
}
}
else if(side<0){
nextp = p.getPassPointByDir(dir);
if(nextp == end){
nextp.parent = p;
return true;
}
if(nextp != null && !this.closeList.contains(nextp)){
addToSearch(p,nextp,this.openList);
}
else
{
nextp = nextPassPointSide(p,end,-1,canPenetrate);
if(nextp == end){
nextp.parent = p;
return true;
}
if(nextp != null && !this.closeList.contains(nextp) && !this.leftList.contains(nextp)){
addToSearch(p,nextp,this.rightList);
}
}
}
return false;
} protected void addToSearch(Point parent,Point next,HashSet<Point> list){
next.clear();
next.parent = parent;
list.add(next);
} /**
*
* @param p
* @param side >0 或者 <0
* @param canPenetrate
* @return
*/
protected Point nextPassPointSide(Point p,Point end,int side,boolean canPenetrate){
int dir = Point.getDirSimple(p, end);
Point nextp = null;
if(side<0){
while(side>=-7){
dir = Point.rightdir(dir);
if(p.canWalkDir(dir,canPenetrate)){
nextp = p.getPassPointByDir(dir);
if(!this.closeList.contains(nextp)){
break;
}
}
side--;
}
}
else
{
while(side<=7){
dir = Point.leftdir(dir);
if(p.canWalkDir(dir,canPenetrate)){
nextp = p.getPassPointByDir(dir);
if(!this.closeList.contains(nextp)){
break;
}
}
side++;
}
}
return nextp;
}
}
使用Java编写的B*算法的更多相关文章
- 「福利」Java Swing 编写的可视化算法工程,包含树、图和排序
之前在整理<学习排序算法,结合这个方法太容易理解了>这篇文章时,发现了一个用 Java Swing 编写的可视化算法工程,真心不错!包含了常用数据结构和算法的动态演示,先来张图感受下: 可 ...
- 小学四则运算练习(JAVA编写)
源码在Github的仓库主页链接地址:https://github.com/rucr9/rucr 看到这个题目,大概很多人会发出“切,这也太简单了吧!有必要小题大做?”的感叹!是的,仅仅作为一道数学运 ...
- 数据结构与算法【Java】05---排序算法总结
前言 数据 data 结构(structure)是一门 研究组织数据方式的学科,有了编程语言也就有了数据结构.学好数据结构才可以编写出更加漂亮,更加有效率的代码. 要学习好数据结构就要多多考虑如何将生 ...
- Java中的经典算法之冒泡排序(Bubble Sort)
Java中的经典算法之冒泡排序(Bubble Sort) 神话丿小王子的博客主页 原理:比较两个相邻的元素,将值大的元素交换至右端. 思路:依次比较相邻的两个数,将小数放在前面,大数放在后面.即在第一 ...
- Java中的查找算法之顺序查找(Sequential Search)
Java中的查找算法之顺序查找(Sequential Search) 神话丿小王子的博客主页 a) 原理:顺序查找就是按顺序从头到尾依次往下查找,找到数据,则提前结束查找,找不到便一直查找下去,直到数 ...
- Java中的经典算法之选择排序(SelectionSort)
Java中的经典算法之选择排序(SelectionSort) 神话丿小王子的博客主页 a) 原理:每一趟从待排序的记录中选出最小的元素,顺序放在已排好序的序列最后,直到全部记录排序完毕.也就是:每一趟 ...
- 网页动物园2.0发布,经过几个月的努力,采用JAVA编写!
网页动物园2.0发布,经过几个月的努力,采用JAVA编写! 网页动物园2.0 正式发布!游戏发布 游戏名称: 网页动物园插件 游戏来源: 原创插件 适用版本: Discuz! X1.5 - X3.5 ...
- Java中的排序算法(2)
Java中的排序算法(2) * 快速排序 * 快速排序使用分治法(Divide and conquer)策略来把一个序列(list)分为两个子序列(sub-lists). * 步骤为: * 1. 从数 ...
- 使用Java编写一个简单的Web的监控系统cpu利用率,cpu温度,总内存大小
原文:http://www.jb51.net/article/75002.htm 这篇文章主要介绍了使用Java编写一个简单的Web的监控系统的例子,并且将重要信息转为XML通过网页前端显示,非常之实 ...
随机推荐
- 章节2:SQL之多表连接
原文:章节2:SQL之多表连接 Sql的多表连接关系有:内连接.外连接和交叉连接. 先建立两个用于演示的表: TB_Characters: Id Character 1 内向 2 外向 3 中性性格 ...
- 使用方便git命令检查记录的版本号
现在开始git大多数用户都经历过subversion,对于这两种开关的版本控制系统需要一段时间去适应.本文旨在帮助恢复一些,这些用户都熟悉的日志记录买家的习惯. 我们要熟悉一个详细的例子git中log ...
- 查询(Query)和标识(Identify)
查询(Query)和标识(Identify) 相关文章:RESTful API URI 设计的一些总结. 问题场景:删除一个资源(Resources),URI 该如何设计? 应用示例:删除名称为 iP ...
- Nyoj 三国志(dijkstra+01背包)
描述 <三国志>是一款很经典的经营策略类游戏.我们的小白同学是这款游戏的忠实玩家.现在他把游戏简化一下,地图上只有他一方势力,现在他只有一个城池,而他周边有一些无人占的空城,但是这些空城中 ...
- GPS坐标互转:WGS-84(GPS)、GCJ-02(Google地图)、BD-09(百度地图)[转]
WGS-84:是国际标准,GPS坐标(Google Earth使用.或者GPS模块)GCJ-02:中国坐标偏移标准,Google Map.高德.腾讯使用BD-09:百度坐标偏移标准,Baidu Map ...
- SSIS从理论到实战,再到应用
原文:SSIS从理论到实战,再到应用 一,是什么(What?) 1.SSIS是Microsoft SQL Server Integration Services的简称,是生成高性能数据集成解决方案(包 ...
- Delegate,Action,Func,Predicate的使用与区别
C#4.0推出后,类似Linq,Lamda表达式等许多新的程序写法层次不穷.与之相关的Delegate,Action,Func,Predicate的使用和区别也常常让大家迷惑,此处就结合实际的应用,对 ...
- 取一种类型里面的产品销售前3甲的数据Sql
需求:取出每种分类里面的销售前3甲的产品信息 表设计如下图: 数据如下: 两种方法可以实现: 1. SELECT * FROM (SELECT ROW_NUMBER() OVER(PARTITION ...
- 从头开始学JavaScript (十三)——Date类型
说明:UTC:国际协调日期 GMT:格林尼治标准时间 一.date类型的创建 使用new操作符和Date()构造函数 var now=new Date(): 传入参数:Date.parse()和Dat ...
- SpringMVC4 + Spring + MyBatis3
SpringMVC4 + Spring + MyBatis3 本文使用最新版本(4.1.5)的springmvc+spring+mybatis,采用最间的配置方式来进行搭建. 1. web.xml 我 ...