Java 计算二维阵列中的曼哈顿距离

Java 计算二维阵列中的曼哈顿距离,java,distance,a-star,Java,Distance,A Star,我正在写一个程序来解决一个NXN8难题。我在测试我的程序时,曼哈顿计算函数与谜题之间的距离有两个偏差,这让我感到很困难。这将最终扩展到使用A*寻路算法,但我还没有做到 以下是我的职能(基于董事会的初始状态,不考虑迄今为止采取的行动量): 我的汉明计算是正确的,返回5,但我的曼哈顿返回8而不是10。我做错了什么 这是我的程序的输出: Size: 3 Initial Puzzle: 8 1 3 4 0 2 7 6 5 Is goal board: fal

我正在写一个程序来解决一个NXN8难题。我在测试我的程序时,曼哈顿计算函数与谜题之间的距离有两个偏差,这让我感到很困难。这将最终扩展到使用A*寻路算法,但我还没有做到

以下是我的职能(基于董事会的初始状态,不考虑迄今为止采取的行动量):

我的汉明计算是正确的,返回5,但我的曼哈顿返回8而不是10。我做错了什么

这是我的程序的输出:

Size: 3
Initial Puzzle: 
 8  1   3   
 4  0   2   
 7  6   5   

Is goal board: false

Goal Array: 
 1  2   3   
 4  5   6   
 7  8   0   
Hamming: 5
Manhatten distance: 8
Inversions: 12
Solvable: true

错误在于距离的更新

写入
distance+=Math.abs(blocks[row][column])+Math.abs(goal[row][column])添加初始和目标单元格的所有内容。只有一个在初始和目标中被排除在外的单元格的坐标与初始中的
0
相同

在您的示例中,这给出了从0到8减去5的2倍总和<代码>2*36-8=64
。然后取8的正方形

曼哈顿-如所述,由行中的距离加上列中的距离计算

您的算法必须像锁一样锁定(注意,前面有伪代码!)


不要求平方根。

文斯和托马斯是谁或什么人?哈哈,他们是我的同事。那为什么他们的名字出现在你的密码里?请清理你的评论我想我在发布之前忘了删除它们。只是好奇,为什么我的评论中有这么大的问题?这是我个人的笔记,用来和我的同学核对我是否做得对。很公平——我想我会问,因为我很好奇你的评论背后的理由是什么。很明显,在StackOverflow方面,你比我更有经验,所以我会采纳你的建议,并将它们应用到我在网站上提出的未来问题中。如果我可以提出一个建议,我会用一种不那么刻薄的方式表达这些担忧;因为它有时会遇到比你预想的更严酷的情况。谢谢你的批评,我希望你有一个良好的休息一天。
 8  1  3        1  2  3     1  2  3  4  5  6  7  8    1  2  3  4  5  6  7  8
 4     2        4  5  6     ----------------------    ----------------------
 7  6  5        7  8        1  1  0  0  1  1  0  1    1  2  0  0  2  2  0  3

 initial          goal         Hamming = 5 + 0          Manhattan = 10 + 0
Size: 3
Initial Puzzle: 
 8  1   3   
 4  0   2   
 7  6   5   

Is goal board: false

Goal Array: 
 1  2   3   
 4  5   6   
 7  8   0   
Hamming: 5
Manhatten distance: 8
Inversions: 12
Solvable: true
for (cell : cells) {
    goalCell = findGoalcell(cell.row, cell.col);
    distance += abs(cell.row - goalCell.row);
    distance += abs(cell.col - goalCell.col);
}