知识大全 使用Java编写的B*算法
Posted 知
篇首语:家资是何物,积帙列梁梠。本文由小常识网(cha138.com)小编为大家整理,主要介绍了知识大全 使用Java编写的B*算法相关的知识,希望对你有一定的参考价值。
使用Java编写的B*算法 以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧!
使用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 = ;
while(!openList isEmpty() || !leftList isEmpty() || !rightList isEmpty())
count ++;
if(count> )
break;
Iterator<Point> it = erator();
if(it hasNext())
Point p = it next();
it remove();
if(sideNext(p end canPenetrate))break;
it = erator();
if(it hasNext())
Point p = it next();
it remove();
if(sideNext(p end canPenetrate))break;
it = erator();
if(it hasNext())
Point p = it next();
it remove();
if(sideNext(p end canPenetrate))break;
final ArrayList<int[]> list = new ArrayList<int[]>();
while(end parent!=null)
list add( new int[]end x end y);
end = end parent;
return list;
/**
*
* @param p
* @param end 目标点
* @param side direct right left
* @param canPenetrate 可否穿透
*/
protected boolean sideNext(Point p Point end int side boolean canPenetrate)
int dir = Point getDirSimple(p end);
Point nextp = null;
if(ntains(p))
nextp = nextPassPointSide(p end canPenetrate);
if(nextp != null)
if(nextp == end)
nextp parent = p;
return true;
if(ntains(nextp))
// return sideNext(nextp end side canPenetrate);
return false;
else if(!ntains(nextp))
addToSearch(p nextp this rightList);
nextp = nextPassPointSide(p end canPenetrate);
if(nextp != null)
if(nextp == end)
nextp parent = p;
return true;
if(ntains(nextp))
// return sideNext(nextp end side canPenetrate);
return false;
else if(!ntains(nextp))
addToSearch(p nextp this leftList);
return false;
this closeList add(p);
if(side == )
if(p canWalkDir(dir canPenetrate))//下一个点可以走
nextp = p getPassPointByDir(dir);
if(nextp == end)
nextp parent = p;
return true;
if(!ntains(nextp))
addToSearch(p nextp this openList);
else//不可走 就分支出两个围绕探索点
nextp = nextPassPointSide(p end canPenetrate);
if(nextp == end)
nextp parent = p;
return true;
if(nextp != null)
if(ntains(nextp))
return sideNext(nextp end side canPenetrate);
// return false;
else if(!ntains(nextp))
addToSearch(p nextp this rightList);
nextp = nextPassPointSide(p end canPenetrate);
if(nextp == end)
nextp parent = p;
return true;
if(nextp != null)
if(ntains(nextp))
return sideNext(nextp end side canPenetrate);
// return false;
else if(!ntains(nextp))
addToSearch(p nextp this leftList);
else if(side> )
nextp = p getPassPointByDir(dir);
if(nextp == end)
nextp parent = p;
return true;
if(nextp != null && !ntains(nextp))
addToSearch(p nextp this openList);
else
nextp = nextPassPointSide(p end canPenetrate);
if(nextp == end)
nextp parent = p;
return true;
if(nextp != null && !ntains(nextp) && !ntains(nextp))
addToSearch(p nextp this leftList);
else if(side< )
nextp = p getPassPointByDir(dir);
if(nextp == end)
nextp parent = p;
return true;
if(nextp != null && !ntains(nextp))
addToSearch(p nextp this openList);
else
nextp = nextPassPointSide(p end canPenetrate);
if(nextp == end)
nextp parent = p;
return true;
if(nextp != null && !ntains(nextp) && !ntains(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 > 或者 <
* @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< )
while(side>= )
dir = Point rightdir(dir);
if(p canWalkDir(dir canPenetrate))
nextp = p getPassPointByDir(dir);
if(!ntains(nextp))
break;
side ;
else
while(side<= )
dir = Point leftdir(dir);
if(p canWalkDir(dir canPenetrate))
nextp = p getPassPointByDir(dir);
if(!ntains(nextp))
break;
side++;
return nextp;
cha138/Article/program/Java/hx/201311/26927
相关参考
使用Java编写B/S网络通信程序 以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧! 网络上的系
使用Java编写B/S网络通信程序 以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧!网络上的系统结构多
Java进阶:Java编写通过代理访问的应用程序 以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧!
JAVA代码编写的30条建议 以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧! ()类名首字母应该大
自己编写的Java数组操作工具 以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧! 看到网上的一段关于
Java进阶:跨平台编写Java程序注意事项 以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧! 使用
时尚:用Java编写手机应用程序 以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧! 不知从什么时候开
要求同题试对单链表编写求C的算法 解 //将AB求交后的结果放在C表中并删除B表 StatusListCross_L(Li
编写Java无脚本的JSP页面 以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧!  
Java语言深入:编写高级JScript代码 以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧! 创建