给定二维平面上三个坐标的曼哈顿距离,任务是找到原始坐标。如果可能有多个解决方案,则打印任何解决方案,否则打印-1 。
Input: d1 = 3, d2 = 4, d3 = 5
Output: (0, 0), (3, 0) and (1, 3)
Manhattan distance between (0, 0) to (3, 0) is 3,
(3, 0) to (1, 3) is 5 and (0, 0) to (1, 3) is 4
Input: d1 = 5, d2 = 10, d3 = 12
Output: -1
方法:让我们分析什么时候不存在解决方案。首先,三角形不等式必须成立,即最大距离不应超过其他两个之和。其次,曼哈顿所有距离的总和应该是偶数。
这就是为什么,如果我们有三个点,并且它们的x坐标分别为x1 , x2和x3 ,则x1
在所有其他情况下,我们都有解决方案。令d1 , d2和d3为给定的曼哈顿距离。将两个点固定为(0,0)和(d1,0) 。现在,由于两个点是固定的,我们可以轻松地找到第三个点,即x3 =(d1 + d2-d3)/ 2和y3 =(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)