我正在使用二维数组(使用Java)实现NXN puzzel。
我的问题是:
1) 如何计算二维数组中的曼哈顿距离
2) 如何在二维数组中生成节点(当前节点)的后继(邻居)。
我在互联网上看过许多例子,他们是如何在一维数组中完成它们的,但现在我需要它们在二维数组中。
如何在Java中向上,向下,向左或向右移动图块?我必须检查什么?需要一些关于如何通过在二维数组中移动UP,DOWN,LEFT或RIGHT来生成后继者的解释。
答案 0 :(得分:4)
从点(a,b)到(c,d)的距离= Math.abs(a-c)+ Math.abs(b-d)
查看名为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);
}
然后拨打floodfill(x,y,0)
,其中x和y是您的起点。到目的地的距离将存储在全局变量距离中。 (并没有真正使用*虽然...)
答案 1 :(得分:2)
修改强>
这是在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;
}
当然,这可以在效率方面得到改善,但它确实起到了作用。