Рубрики

Найти исходные координаты, чьи расстояния на Манхэттене указаны

Учитывая манхэттенские расстояния трех координат на двумерной плоскости, задача состоит в том, чтобы найти исходные координаты. Распечатайте любое решение, если возможно несколько решений, иначе выведите -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 <x2 <x3 . Они будут вносить вклад в сумму (x2 — x1) + (x3 — x1) + (x3 — x2) = 2 * (x3 — x1) . Та же логика применяется для y-координат.
Во всех остальных случаях у нас есть решение. Пусть d1 , d2 и d3 — заданные манхэттенские расстояния. Зафиксируйте две точки как (0, 0) и (d1, 0) . Теперь, когда две точки фиксированы, мы можем легко найти третью точку как x3 = (d1 + d2 — d3) / 2 и y3 = (d2 — x3) .

Ниже приведена реализация вышеуказанного подхода:

C ++

// 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);

  
}
}

  
// Этот код предоставлен anuj_67 ..

python3

# Python3 реализация подхода

  
# Функция поиска оригинала согласована

def solve(d1, d2, d3) :

  

      

    # Максимум заданных расстояний

    maxx = max(d1, max(d2, d3))

      

    # Сумма заданных расстояний

    sum = (d1 + d2 + d3)

      

    # Условия, когда

    # решение не существует

    if (2 * maxx > sum or sum % 2 == 1) :

        print("-1")

        return

      

      

    # Первая координата

    x1 = 0

    y1 = 0

      

    # Вторая координата

    x2 = d1 

    y2 = 0

      

    # Третья координата

    x3 = (d1 + d2 - d3) // 2

    y3 = (d2 + d3 - d1) // 2

    print("(" , x1 , "," , y1 , "), ("

        , x2 , "," , y2 , ") and ("

        , x3 , "," , y3 , ")")

  

  
# Код драйвера

d1 = 3

d2 = 4

d3 = 5

solve(d1, d2, d3)

  
# Этот код предоставлен ihritik

C #

// 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);

  
}
}

  
// Этот код предоставлен mits

Выход:

(0, 0), (3, 0) and (1, 3)

Рекомендуемые посты:

Найти исходные координаты, чьи расстояния на Манхэттене указаны

0.00 (0%) 0 votes