Find the original coordinates whose Manhattan distances are given
Last Updated :
23 Jun, 2022
Given the Manhattan distances of three coordinates on a 2-D plane, the task is to find the original coordinates. Print any solution if multiple solutions are possible else print -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
Approach: Let’s analyze when no solution exists. First the triangle inequality must hold true i.e. the largest distance should not exceed the sum of other two. Second, sum of all Manhattan distances should be even.
Here’s why, if we have three points and their x-coordinates are x1, x2 and x3 such that x1 < x2 < x3. They will contribute to the sum (x2 – x1) + (x3 – x1) + (x3 – x2) = 2 * (x3 – x1). Same logic applied for y-coordinates.
In all the other cases, we have a solution. Let d1, d2 and d3 be the given Manhattan distances. Fix two points as (0, 0) and (d1, 0). Now since two points are fixed, we can easily find the third point as x3 = (d1 + d2 – d3) / 2 and y3 = (d2 – x3).
Below is the implementation of the above approach:
C++
#include <bits/stdc++.h>
using namespace std;
void solve( int d1, int d2, int d3)
{
int maxx = max(d1, max(d2, d3));
int sum = (d1 + d2 + d3);
if (2 * maxx > sum or sum % 2 == 1) {
cout << "-1" ;
return ;
}
int x1 = 0, y1 = 0;
int x2 = d1, y2 = 0;
int x3 = (d1 + d2 - d3) / 2;
int y3 = (d2 + d3 - d1) / 2;
cout << "(" << x1 << ", " << y1 << "), ("
<< x2 << ", " << y2 << ") and ("
<< x3 << ", " << y3 << ")" ;
}
int main()
{
int d1 = 3, d2 = 4, d3 = 5;
solve(d1, d2, d3);
return 0;
}
|
Java
import java .io.*;
class GFG
{
static void solve( int d1, int d2, int d3)
{
int maxx = Math.max(d1, Math.max(d2, d3));
int sum = (d1 + d2 + d3);
if ( 2 * maxx > sum || sum % 2 == 1 )
{
System.out.print( "-1" );
return ;
}
int x1 = 0 , y1 = 0 ;
int x2 = d1, y2 = 0 ;
int x3 = (d1 + d2 - d3) / 2 ;
int y3 = (d2 + d3 - d1) / 2 ;
System.out.print( "(" +x1+ ", " +y1+ "), (" +x2+ ", " +y2+ ") and (" +x3+ ", " +y3+ ")" );
}
public static void main(String[] args)
{
int d1 = 3 , d2 = 4 , d3 = 5 ;
solve(d1, d2, d3);
}
}
|
Python3
# Python implementation of the approach
import math
# Function to find the original coordinated
def solve(d1, d2, d3):
# Maximum of the given distances
maxx = max(d1, 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 = math.floor((d1 + d2 - d3) / 2)
y3 = math.floor((d2 + d3 - d1) / 2)
print(f"( {x1}, {y1}), ({x2}, {y2}) and ({x3}, {y3})")
# Driver code
d1 = 3
d2 = 4
d3 = 5
solve(d1, d2, d3)
# The code is contributed by Gautam goel (gautamgoel962)
C#
using System;
class GFG
{
static void solve( int d1, int d2, int d3)
{
int maxx = Math.Max(d1, Math.Max(d2, d3));
int sum = (d1 + d2 + d3);
if (2 * maxx > sum || sum % 2 == 1)
{
Console.WriteLine( "-1" );
return ;
}
int x1 = 0, y1 = 0;
int x2 = d1, y2 = 0;
int x3 = (d1 + d2 - d3) / 2;
int y3 = (d2 + d3 - d1) / 2;
Console.WriteLine( "(" +x1+ ", " +y1+ "), (" +x2+ ", " +y2+ ") and (" +x3+ ", " +y3+ ")" );
}
static void Main()
{
int d1 = 3, d2 = 4, d3 = 5;
solve(d1, d2, d3);
}
}
|
Javascript
<script>
function solve(d1, d2, d3)
{
let maxx = Math.max(d1, Math.max(d2, d3));
let sum = (d1 + d2 + d3);
if (2 * maxx > sum || sum % 2 == 1) {
document.write( "-1" );
return ;
}
let x1 = 0, y1 = 0;
let x2 = d1, y2 = 0;
let x3 = parseInt((d1 + d2 - d3) / 2);
let y3 = parseInt((d2 + d3 - d1) / 2);
document.write( "(" + x1 + ", " + y1 + "), ("
+ x2 + ", " + y2 + ") and ("
+ x3 + ", " + y3 + ")" );
}
let d1 = 3, d2 = 4, d3 = 5;
solve(d1, d2, d3);
</script>
|
Output:
(0, 0), (3, 0) and (1, 3)
Time Complexity: O(1)
Auxiliary Space: O(1)
Share your thoughts in the comments
Please Login to comment...