Java 曼哈顿启发式A*算法
我正在二维数组中实现NXN puzzel(使用Java) 我的问题是: (一) 如何计算二维数组中的曼哈顿距离 (二) 如何在二维数组中生成节点(当前节点)的后续节点(邻居) 我在互联网上看到了很多例子,它们是如何在一维数组中实现的,但现在我需要它们在二维数组中 编辑 在Java中如何向上、向下、向左或向右移动平铺?我必须检查哪些东西?需要一些关于如何通过在二维数组中向上、向下、向左或向右移动来生成后续对象的说明Java 曼哈顿启发式A*算法,java,algorithm,Java,Algorithm,我正在二维数组中实现NXN puzzel(使用Java) 我的问题是: (一) 如何计算二维数组中的曼哈顿距离 (二) 如何在二维数组中生成节点(当前节点)的后续节点(邻居) 我在互联网上看到了很多例子,它们是如何在一维数组中实现的,但现在我需要它们在二维数组中 编辑 在Java中如何向上、向下、向左或向右移动平铺?我必须检查哪些东西?需要一些关于如何通过在二维数组中向上、向下、向左或向右移动来生成后续对象的说明 结果是| x2-x1 |+| y2-y1| 一个节点的继承者由游戏中当前节点的所有
ArrayList<Point> adjacentPoints(Point point) {
// W and H are class fields indicating width/height of 2D array
ArrayList<Point> points = new ArrayList<Point>();
if (point.x > 0) {
points.add(new Point(point.x - 1, point.y);
}
if (point.y > 0) {
points.add(new Point(point.x - 1, point.y);
}
if (point.x < W - 1) {
points.add(new Point(point.x + 1, point.y);
}
if (point.y < H - 1) {
points.add(new Point(point.x, point.y + 1);
}
return points;
}
ArrayList邻接点(点){
//W和H是表示二维数组宽度/高度的类字段
ArrayList points=新的ArrayList();
如果(点x>0){
添加点(新点(点x-1,点y);
}
如果(点y>0){
添加点(新点(点x-1,点y);
}
如果(点x
当然,这在效率方面是可以改进的,但它确实起到了作用
ArrayList<Point> adjacentPoints(Point point) {
// W and H are class fields indicating width/height of 2D array
ArrayList<Point> points = new ArrayList<Point>();
if (point.x > 0) {
points.add(new Point(point.x - 1, point.y);
}
if (point.y > 0) {
points.add(new Point(point.x - 1, point.y);
}
if (point.x < W - 1) {
points.add(new Point(point.x + 1, point.y);
}
if (point.y < H - 1) {
points.add(new Point(point.x, point.y + 1);
}
return points;
}
ArrayList邻接点(点){
//W和H是表示二维数组宽度/高度的类字段
ArrayList points=新的ArrayList();
如果(点x>0){
添加点(新点(点x-1,点y);
}
如果(点y>0){
添加点(新点(点x-1,点y);
}
如果(点x
当然,这在效率方面是可以改进的,但它确实起到了作用
public void floodfill(x,y, distanceSoFar)
{
if (x is out of bounds || y is out of bounds)
return
if ((x,y) == destination))
{
distance = distanceSoFar;
return;
}
floodfill(x+1,y,distanceSoFar + 1);
floodfill(x-1,y,distanceSoFar + 1);
floodfill(x,y+1,distanceSoFar + 1);
floodfill(x,y-1,distanceSoFar + 1);
}
floodfill(x,y,0)
其中x和y是起点。到目的地的距离将存储在全局可变距离中。(没有真正使用*虽然…)
public void floodfill(x,y, distanceSoFar)
{
if (x is out of bounds || y is out of bounds)
return
if ((x,y) == destination))
{
distance = distanceSoFar;
return;
}
floodfill(x+1,y,distanceSoFar + 1);
floodfill(x-1,y,distanceSoFar + 1);
floodfill(x,y+1,distanceSoFar + 1);
floodfill(x,y-1,distanceSoFar + 1);
}
然后调用
floodfill(x,y,0)
其中x和y是您的起点。到您的目的地的距离将存储在全局变量距离中。(没有真正使用*虽然…我必须根据f=g+h生成后续。g=从起始节点到当前节点的距离,h=曼哈顿hereustic(1步成本)@EddyFreeman-生成继任者与启发式搜索无关。公式f=g+h
用于选择下一步要探索的继任者。如果您可以从数组中的任意点移动到任意4个相邻点(左、右、上、下;无对角移动),然后每一个都试一下,去掉那些有越界坐标的。很好的Ted。这就是我要找的。我认为我的问题没有很好地表述。我如何通过移动到四个相邻的点在Java中实现它。你能帮我解释一下吗?或者告诉我任何我能获得更多信息的来源。thanks@EddyFreeman-很乐意帮忙。请注意,如果规则允许围绕电路板进行包装(从右边缘向右移动会将您带到左边缘),则逻辑将被更改为使用模运算,而不是使用if
测试。这样,您将始终有4个后续节点。我必须根据f=g+h生成后续节点。g=从开始节点到当前节点的距离,h=h(1步成本)@EddyFreeman-生成继任者与启发式搜索无关。公式f=g+h
用于选择下一步要探索的继任者。如果您可以从数组中的任意点移动到任意4个相邻点(左、右、上、下;无对角移动),然后每一个都试一下,去掉那些有越界坐标的。很好的Ted。这就是我要找的。我认为我的问题没有很好地表述。我如何通过移动到四个相邻的点在Java中实现它。你能帮我解释一下吗?或者告诉我任何我能获得更多信息的来源。thanks@EddyFreeman-很乐意帮忙。请注意,如果规则允许围绕电路板进行包装(从右边缘向右移动会将您带到左边缘),然后逻辑将被更改为使用模运算,而不是使用if
测试。这样,您将始终有4个后续节点。哎呀,我不知道为什么代码格式会出错…我是新的抱歉。没问题。我真的想用A*来解决它。哎呀,我不知道为什么代码格式会出错…我是新的抱歉。没问题。我是真的我想用A*来解决这个问题。