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