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

📅  最后修改于: 2021-04-29 10:23:44             🧑  作者: Mango

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

方法:让我们分析什么时候不存在解决方案。首先,三角形不等式必须成立,即最大距离不应超过其他两个之和。其次,曼哈顿所有距离的总和应该是偶数。
这就是为什么,如果我们有三个点,并且它们的x坐标分别为x1x2x3 ,则x1 。它们将贡献总和(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


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