具有曼哈顿启发式的A *算法

时间:2011-11-21 15:20:31

标签: java algorithm

我正在使用二维数组(使用Java)实现NXN puzzel。

我的问题是:

1) 如何计算二维数组中的曼哈顿距离

2) 如何在二维数组中生成节点(当前节点)的后继(邻居)。

我在互联网上看过许多例子,他们是如何在一维数组中完成它们的,但现在我需要它们在二维数组中。

修改

如何在Java中向上,向下,向左或向右移动图块?我必须检查什么?需要一些关于如何通过在二维数组中移动UP,DOWN,LEFT或RIGHT来生成后继者的解释。

2 个答案:

答案 0 :(得分:4)

  1. 从点(a,b)到(c,d)的距离= Math.abs(a-c)+ Math.abs(b-d)

  2. 查看名为floodfill的内容。它基本上是这样的:

    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);
    }
    
  3. 然后拨打floodfill(x,y,0),其中x和y是您的起点。到目的地的距离将存储在全局变量距离中。 (并没有真正使用*虽然...)

答案 1 :(得分:2)

  1. Manhattan distance只是| x 2 - x 1 | + | y 2 - y 1 |
  2. 节点的后继者是由游戏从当前节点进行的所有合法移动生成的。如何做到这一点取决于游戏规则,而不仅仅是在2D板上玩的游戏。
  3. 修改

    这是在2D阵列上生成相邻点列表的一种方法:

    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;
    }
    

    当然,这可以在效率方面得到改善,但它确实起到了作用。