📌  相关文章
📜  找到给出曼哈顿距离的原始坐标

📅  最后修改于: 2021-10-23 08:22:02             🧑  作者: Mango

给定二维平面上三个坐标的曼哈顿距离,任务是找到原始坐标。如果可能有多个解决方案,则打印任何解决方案,否则打印-1

方法:当不存在解决方案时,让我们分析一下。首先三角不等式必须成立,即最大距离不应超过其他两个的总和。其次,所有曼哈顿距离的总和应该是偶数。
这就是为什么,如果我们有三个点并且它们的 x 坐标是x1x2x3 ,使得x1 < x2 < x3 。它们将对总和(x2 – x1) + (x3 – x1) + (x3 – x2) = 2 * (x3 – x1)做出贡献。相同的逻辑适用于 y 坐标。
在所有其他情况下,我们有一个解决方案。让d1d2d3是给定的曼哈顿距离。将两个点固定为(0, 0)(d1, 0) 。现在因为两个点是固定的,我们可以很容易地找到第三个点x3 = (d1 + d2 – d3) / 2y3 = (d2 – x3)
下面是上述方法的实现:

C++
// C++ implementation of the approach
#include 
using namespace std;
 
// Function to find the original coordinated
void solve(int d1, int d2, int d3)
{
 
    // Maximum of the given distances
    int maxx = max(d1, max(d2, d3));
 
    // Sum of the given distances
    int sum = (d1 + d2 + d3);
 
    // Conditions when the
    // solution doesn't exist
    if (2 * maxx > sum or sum % 2 == 1) {
        cout << "-1";
        return;
    }
 
    // First coordinate
    int x1 = 0, y1 = 0;
 
    // Second coordinate
    int x2 = d1, y2 = 0;
 
    // Third coordinate
    int x3 = (d1 + d2 - d3) / 2;
    int y3 = (d2 + d3 - d1) / 2;
    cout << "(" << x1 << ", " << y1 << "), ("
         << x2 << ", " << y2 << ") and ("
         << x3 << ", " << y3 << ")";
}
 
// Driver code
int main()
{
    int d1 = 3, d2 = 4, d3 = 5;
    solve(d1, d2, d3);
 
    return 0;
}


Java
// Java implementation of the approach
import java .io.*;
 
class GFG
{
     
// Function to find the original coordinated
static void solve(int d1, int d2, int d3)
{
 
    // Maximum of the given distances
    int maxx = Math.max(d1, Math.max(d2, d3));
 
    // Sum of the given distances
    int sum = (d1 + d2 + d3);
 
    // Conditions when the
    // solution doesn't exist
    if (2 * maxx > sum || sum % 2 == 1)
    {
        System.out.print("-1");
        return;
    }
 
    // First coordinate
    int x1 = 0, y1 = 0;
 
    // Second coordinate
    int x2 = d1, y2 = 0;
 
    // Third coordinate
    int x3 = (d1 + d2 - d3) / 2;
    int y3 = (d2 + d3 - d1) / 2;
    System.out.print("("+x1+", "+y1+"), ("+x2+", "+y2+") and ("+x3+", "+y3+")");
}
 
// Driver code
public static void main(String[] args)
{
    int d1 = 3, d2 = 4, d3 = 5;
    solve(d1, d2, d3);
 
}
}
 
// This code is contributed by anuj_67..
Python3 # Python3 implementation of the approach

# Function to find the original coordinated
def solve(d1, d2, d3) :

    
    # Maximum of the given distances
    maxx = max(d1, max(d2, d3))
    
    # Sum of the given distances
    sum = (d1 + d2 + d3)
    
    # Conditions when the
    # solution doesn't exist
    if (2 * maxx > sum or sum % 2 == 1) :
        print("-1")
        return
    
    
    # First coordinate
    x1 = 0
    y1 = 0
    
    # Second coordinate
    x2 = d1 
    y2 = 0
    
    # Third coordinate
    x3 = (d1 + d2 - d3) // 2
    y3 = (d2 + d3 - d1) // 2
    print("(" , x1 , "," , y1 , "), ("
        , x2 , "," , y2 , ") and ("
        , x3 , "," , y3 , ")")


# Driver code
d1 = 3
d2 = 4
d3 = 5
solve(d1, d2, d3)

# This code is contributed by ihritik


C#
// C# implementation of the approach
using System;
 
class GFG
{
     
// Function to find the original coordinated
static void solve(int d1, int d2, int d3)
{
 
    // Maximum of the given distances
    int maxx = Math.Max(d1, Math.Max(d2, d3));
 
    // Sum of the given distances
    int sum = (d1 + d2 + d3);
 
    // Conditions when the
    // solution doesn't exist
    if (2 * maxx > sum || sum % 2 == 1)
    {
        Console.WriteLine("-1");
        return;
    }
 
    // First coordinate
    int x1 = 0, y1 = 0;
 
    // Second coordinate
    int x2 = d1, y2 = 0;
 
    // Third coordinate
    int x3 = (d1 + d2 - d3) / 2;
    int y3 = (d2 + d3 - d1) / 2;
    Console.WriteLine("("+x1+", "+y1+"), ("+x2+", "+y2+") and ("+x3+", "+y3+")");
}
 
// Driver code
static void Main()
{
    int d1 = 3, d2 = 4, d3 = 5;
    solve(d1, d2, d3);
 
}
}
 
// This code is contributed by mits


Javascript


输出:
(0, 0), (3, 0) and (1, 3)

如果您希望与专家一起参加现场课程,请参阅DSA 现场工作专业课程学生竞争性编程现场课程