Pares con la misma distancia Manhattan y euclidiana

En un plano cartesiano dado, hay N puntos. La tarea es encontrar el número de pares de puntos (A, B) tales que 
 

  • El punto A y el punto B no coinciden.
  • La Distancia Manhattan y la Distancia Euclidiana entre los puntos deben ser iguales.

Nota: El par de 2 puntos (A, B) se considera igual que el par de 2 puntos (B, A).
 

Distancia Manhattan = |x2-x1|+|y2-y1|
Distancia Euclidiana = ((x2-x1)^2 + (y2-y1)^2)^0.5 donde los puntos son (x1, y1) y (x2, y2).

Ejemplos: 

Entrada: N = 3, Puntos = {{1, 2}, {2, 3}, {1, 3}} 
Salida:
Los pares son: 
1) (1, 2) y (1, 3) 
Distancia euclidiana de ( 1, 2) y (1, 3) = &root;((1 – 1) 2 + (3 – 2) 2 ) = 1 
Distancia Manhattan de (1, 2) y (1, 3) = |(1 – 1 )| + |(2 – 3)| = 1
2) (1, 3) y (2, 3) 
Distancia euclidiana de (1, 3) y (2, 3) = &root;((1 – 2) 2 + (3 – 3) 2 ) = 1 
Manhattan distancia de (1, 3) y (2, 3) = |(1 – 2)| + |(3 – 3)| = 1
Entrada: N = 3, Puntos = { {1, 1}, {2, 3}, {1, 1} } 
Salida:
Aquí ninguno de los pares cumple las dos condiciones anteriores

Enfoque: Al resolver la ecuación 
 

|x2-x1|+|y2-y1| = sqrt((x2-x1)^2+(y2-y1)^2)

 
obtenemos, x2 = x1 o y2 = y1.
Considere 3 mapas, 
1) Mapa X, donde X[x i ] almacena el número de puntos que tienen su coordenada x igual a x i 
2) Mapa Y, donde Y[y i ] almacena el número de puntos que tienen su coordenada y igual a y i 
3) Mapa XY, donde XY[(X i , Y i )] almacena el número de puntos coincidentes con el punto (x i , y i )
Ahora, 
sea Xans el Número de pares con las mismas coordenadas X = X[x i ] 2 para todo x i distinto = 
Sea Yans el Número de pares con las mismas coordenadas Y =Y[x i ] 2 para todos los y i 
distintos Sea XYans el número de puntos coincidentes = XY[{x i , y i }] 2 para todos los puntos distintos (x i , y i )
Por lo tanto, la respuesta requerida = Xans + Yans – XYans
A continuación se muestra la implementación del enfoque anterior:

C++

// C++ implementation of the above approach
#include <bits/stdc++.h>
using namespace std;
 
// Function to return the number of non coincident
// pairs of points with manhattan distance
// equal to euclidean distance
int findManhattanEuclidPair(pair<int, int> arr[], int n)
{
    // To store frequency of all distinct Xi
    map<int, int> X;
 
    // To store Frequency of all distinct Yi
    map<int, int> Y;
 
    // To store Frequency of all distinct
    // points (Xi, Yi);
    map<pair<int, int>, int> XY;
 
    for (int i = 0; i < n; i++) {
        int xi = arr[i].first;
        int yi = arr[i].second;
 
        // Hash xi coordinate
        X[xi]++;
 
        // Hash yi coordinate
        Y[yi]++;
 
        // Hash the point (xi, yi)
        XY[arr[i]]++;
    }
 
    int xAns = 0, yAns = 0, xyAns = 0;
 
    // find pairs with same Xi
    for (auto xCoordinatePair : X) {
        int xFrequency = xCoordinatePair.second;
 
        // calculate ((xFrequency) C2)
        int sameXPairs
            = (xFrequency * (xFrequency - 1)) / 2;
        xAns += sameXPairs;
    }
 
    // find pairs with same Yi
    for (auto yCoordinatePair : Y) {
        int yFrequency = yCoordinatePair.second;
 
        // calculate ((yFrequency) C2)
        int sameYPairs
            = (yFrequency * (yFrequency - 1)) / 2;
        yAns += sameYPairs;
    }
 
    // find pairs with same (Xi, Yi)
    for (auto XYPair : XY) {
        int xyFrequency = XYPair.second;
 
        // calculate ((xyFrequency) C2)
        int samePointPairs
            = (xyFrequency * (xyFrequency - 1)) / 2;
        xyAns += samePointPairs;
    }
 
    return (xAns + yAns - (2 * xyAns));
    /*    we are subtracting 2 * xyAns because we have counted
       let say A,B coinciding points two times in xAns and
       yAns which should not be add to the final answer so
       we are subtracting xyAns 2 times. */
}
 
// Driver Code
int main()
{
    pair<int, int> arr[]
        = { { 1, 2 }, { 1, 2 }, { 4, 3 }, { 1, 3 } };
    int n = sizeof(arr) / sizeof(arr[0]);
 
    cout << findManhattanEuclidPair(arr, n) << endl;
    return 0;
}

Python3

# Python3 implementation of the
# above approach
from collections import defaultdict
 
# Function to return the number of
# non coincident pairs of points with
# manhattan distance equal to
# euclidean distance
def findManhattanEuclidPair(arr, n):
 
    # To store frequency of all distinct Xi
    X = defaultdict(lambda:0)
 
    # To store Frequency of all distinct Yi
    Y = defaultdict(lambda:0)
 
    # To store Frequency of all distinct
    # points (Xi, Yi)
    XY = defaultdict(lambda:0)
 
    for i in range(0, n):
        xi = arr[i][0]
        yi = arr[i][1]
 
        # Hash xi coordinate
        X[xi] += 1
 
        # Hash yi coordinate
        Y[yi] += 1
 
        # Hash the point (xi, yi)
        XY[tuple(arr[i])] += 1
     
    xAns, yAns, xyAns = 0, 0, 0
 
    # find pairs with same Xi
    for xCoordinatePair in X:
        xFrequency = X[xCoordinatePair]
 
        # calculate ((xFrequency) C2)
        sameXPairs = (xFrequency *
                     (xFrequency - 1)) // 2
        xAns += sameXPairs
     
    # find pairs with same Yi
    for yCoordinatePair in Y:
        yFrequency = Y[yCoordinatePair]
 
        # calculate ((yFrequency) C2)
        sameYPairs = (yFrequency *
                     (yFrequency - 1)) // 2
        yAns += sameYPairs
 
    # find pairs with same (Xi, Yi)
    for XYPair in XY:
        xyFrequency = XY[XYPair]
     
        # calculate ((xyFrequency) C2)
        samePointPairs = (xyFrequency *
                         (xyFrequency - 1)) // 2
        xyAns += samePointPairs
     
    return (xAns + yAns - 2 * xyAns)
  #    we are subtracting 2 * xyAns because we have counted let say A,B coinciding points two times
   #  in xAns and yAns which should not be add to the final answer so we are subtracting xyAns 2 times.
 
# Driver Code
if __name__ == "__main__":
 
    arr = [[1, 2], [1,2], [4, 3], [1, 3]]
     
    n = len(arr)
 
    print(findManhattanEuclidPair(arr, n))
     
# This code is contributed by Rituraj Jain
Producción

3

Complejidad de tiempo : O(NlogN), donde N es el número de puntos 
Complejidad de espacio : O(N), ya que se ha tomado N espacio adicional.
 

Publicación traducida automáticamente

Artículo escrito por sirjan13 y traducido por Barcelona Geeks. The original can be accessed here. Licence: CCBY-SA

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *