在网格中给出3个点,您将如何找到一个点,使得该点与所有3个点的距离之和最小化。这个问题的一个明显答案是费马的三角形。我有兴趣知道我们是否可以在图表中使用广度优先搜索算法来定位费马的点。
struct node{
int Person1X,Person1Y,Person2X,Person2Y,Person3X,Person3Y; //X and Y coordinates of all 3 persons
int steps; //sum of distances covered by all 3 person to reach this state
}
在做BFS时,我们可以设置约束, 如果步骤> min(三角形的任意两个边的总和,以3个人为顶点)返回;
if(Person1X=Person2X=Person2X)AND(Person1Y=Person2Y=Person3Y) return steps;
答案 0 :(得分:1)
无需搜索。
鉴于“三角形”ABC: SumOfDistances(p)= dist(A,p)+ dist(B,p)+ dist(C,p)
其中dist(q,p)= | q x -p x | + | q y -p y | (曼哈顿距离)
你可以看到SumOfDistances(p)= SumOfDistances x (p)+ SumOfDistances y (p)
因此,您可以单独最小化x和y轴上的距离。
因此,费马点的x坐标是3个给定x坐标的中位数。 费马点的y坐标是3个给定y坐标的中位数。