2011-11-23 107 views
1

我想知道计算下面的代码snipets的曼哈顿距离的区别。我有2D阵列int[][] state并希望从当前节点到目标节点计算manahattan距离: 例如:曼哈顿距离澄清

当前节点

0 1 3 
4 2 5 
7 8 6 

0 ==空瓦片

我现在必须计算从节点到目标节点的曼哈顿距离:

1 2 3 
4 5 6 
7 8 0 

这些是我发现的一些例子:

1)这其中使用x和y坐标来计算距离

public int manhattan(Node currentNode, Node goalNode) { 
    return Math.abs(currentNode.x - goalNode.x) + Math.abs(currentNode.y - goalNode.y); 
} 


2)此人使用的坐标,但确实在其中我不一些计算不明白意义。

private static int manhattan(int[] pos, int tile) { 
    int[] dest = new int[] { (tile - 1) % size, (tile - 1)/size }; 
    return Math.abs(dest[0] - pos[0]) + Math.abs(dest[1] - pos[1]); 
} 



3)这一个人在细胞中使用这些数字做计算

public int Manhattan(Node current Node goal){ 
    int dist = 0; 
    for(int x = 0; x < current.row; x++) 
     for(int y = 0; y < current.col; y++) 
      dist += Math.abs(current.state[x][y] - goal.state[x][y]); 
} 

哪一个是正确的吗?

谢谢

回答

4

第一个假设边框不能缠绕。第二个假设是,如果你走到右边的右边,你会到达左边。我不知道第三人正在做什么与曼哈顿距离有关。对你来说正确的一个取决于你想要解决什么问题。

+1

+1为清晰的答案。我正要跳进去,但你钉了它。 –

+0

感谢您的回复。我正在求解NxN puzzel来将这些数字排列在一个NxN网格中。在我的文章中,你会看到当前节点,我必须计算从那里到目标节点的距离。我必须用曼哈顿的方法来解决NxN的困惑。我应该使用哪一个? –

+0

啊,好的。起初,我没有从图表中获得。你可能会想使用第一个。 – meem1029