我有一个8x10的矩阵,其中有一些正方形被遮挡:
no = [(2,4),(3,4),(6,4),(7,4),(2,5),(3,5),(6,5),(7,5)]
我需要确定两点之间的最短(曼哈顿)路径是否以嵌套元组(例如[[0,5),(6,2))的形式提供给此函数,是否包含任何块,然后重新绕过它。
现在要做的是,我正在尝试应用适用于欧氏距离的逻辑,以查看 C 是否在 A 和 B之间的直线上,方法是将 A 到 C 的距离加到 C 到 B 的距离,它等于 A 到 B ,但是我不相信数学...
def manhattan_dist(move): #order doesn't matter
a = move[0][0]
b = move[0][1]
c = move[1][0]
d = move[1][1]
mandist = abs(a-c)+abs(b-d)
if (any (abs(a-box[0])+abs(b-box[1])) == (mandist-(abs(c-box[0])+abs(d-box[1]))) for box in no):
print("blocked")
#calculate go-around logic
return mandist
它为manhattan_dist(((0,1),(0,7)))
打印“阻塞”,所以我知道我也在python中做错了事。
答案 0 :(得分:1)
由于没有代表(...我是新来的),因此而不是发表意见。
在我看来有点不明确。曼哈顿距离没有一条最短的路线...实际上,按照定义,它有很多最短的路线。
所以也许尝试弄清楚你的意思?
顺便说一句,如果您想知道是否任何个曼哈顿路径被阻止,那么这意味着您有一个带有
的盒子min([a, c]) < box[0] < max([a, c]) and min([b, d]) < box[1] < max([b, d])
由于评论中的讨论而进行编辑:
首先,总有abs(a-c) + abs(b-d)
个 choose abs(a-c)
路径具有最小的曼哈顿距离。 (对这个错误的表示法表示抱歉;只是紧随问题参数之后,不幸的是缺少乳胶支持。)
如果您正确地处理了几何图形, all 最小的路径被阻塞是非常棘手的,而且不会很快。我不会立即看到一种避免循环遍历所有路径的方法,通过将路径分类到分层树中并在正方形被阻塞时删除完整分支获得了一些优化……
答案 1 :(得分:0)
现在要做的是,我试图通过将从A到C的距离加到从C到B的距离上,并应用适用于欧几里德距离的逻辑,以查看C是否在A和B之间的直线上。如果它等于A到B
您在此处使用的数学概念称为“度量”。这只是您已经熟悉的欧几里得距离的概括。有关详细信息,请参见the wikipedia article。曼哈顿距离满足度量标准的所有要求。这意味着您可以放心,如果d(A, B) + d(B, C) = d(A, C)
,B
位于A
和C
之间的最短路径上。与欧几里得距离不同,从A
到C
的路径可能有很多,并且距离相同,其中许多路径可能会经过B
。