Recuento de cuadrados que son paralelos al eje de coordenadas del conjunto dado de N puntos

Dada una array de puntos puntos[] en un sistema de coordenadas cartesianas, la tarea es encontrar el número de cuadrados que son paralelos al eje de coordenadas.

Ejemplos:

Entrada: puntos[] = {(0, 0), (0, 2), (2, 0), (2, 2), (1, 1)}
Salida: 1
Explicación:
Como los puntos (0, 0) , (0, 2), (2, 0), (2, 2) forman un cuadrado que es paralelo al eje X y al eje Y, por lo tanto, el recuento de tales cuadrados es 1.

Entrada: puntos[] = {(2, 0), (0, 2), (2, 2), (0, 0), (-2, 2), (-2, 0)}
Salida: 2
Explicación:
Como los puntos (0, 0), (0, 2), (2, 0), (2, 2) forman un cuadrado, mientras que los puntos (0, 0), (0, 2), (-2, 0) , (-2, 2) forma otro cuadrado que es paralelo al eje X y al eje Y, por
lo tanto, la cuenta de tales cuadrados es 2.

Enfoque: la idea es elegir dos puntos de la array de puntos de manera que estos dos puntos sean paralelos al eje de coordenadas y luego encontrar otros dos puntos del cuadrado con la ayuda de la distancia entre los puntos. Si esos puntos existen en la array, entonces, existe un cuadrado posible.

A continuación se muestra la implementación del enfoque anterior:

C++

// C++ implementation to find count of Squares
// that are parallel to the coordinate axis
// from the given set of N points
  
#include <bits/stdc++.h>
using namespace std;
  
#define sz(x) int(x.size())
  
// Function to get distance
// between two points
int get_dis(pair<int, int> p1,
            pair<int, int> p2)
{
    int a = abs(p1.first - p2.first);
    int b = abs(p1.second - p2.second);
    return ((a * a) + (b * b));
}
  
// Function to check that points
// forms a square and parallel to
// the co-ordinate axis
bool check(pair<int, int> p1,
           pair<int, int> p2,
           pair<int, int> p3,
           pair<int, int> p4)
{
  
    int d2 = get_dis(p1, p2);
    int d3 = get_dis(p1, p3);
    int d4 = get_dis(p1, p4);
    if (d2 == d3
        && 2 * d2 == d4
        && 2 * get_dis(p2, p4) == get_dis(p2, p3)) {
        return true;
    }
    if (d3 == d4
        && 2 * d3 == d2
        && 2 * get_dis(p3, p2) == get_dis(p3, p4)) {
        return true;
    }
    if (d2 == d4
        && 2 * d2 == d3
        && 2 * get_dis(p2, p3) == get_dis(p2, p4)) {
        return true;
    }
    return false;
}
  
// Function to find all the squares which is
// parallel to co-ordinate axis
int count(map<pair<int, int>, int> hash,
          vector<pair<int, int> > v, int n)
{
    int ans = 0;
    map<pair<int, int>, int> vis;
  
    // Loop to choose two points
    // from the array of points
    for (int i = 0; i < n; i++) {
        for (int j = 0; j < n; j++) {
            if (i == j)
                continue;
            pair<int, int> p1
                = make_pair(v[i].first,
                            v[j].second);
            pair<int, int> p2
                = make_pair(v[j].first,
                            v[i].second);
            set<pair<int, int> > s;
            s.insert(v[i]);
            s.insert(v[j]);
            s.insert(p1);
            s.insert(p2);
            if (sz(s) != 4)
                continue;
  
            // Condition to check if the
            // other points are present in the map
            if (hash.find(p1) != hash.end()
                && hash.find(p2) != hash.end()) {
                if ((!vis[v[i]] || !vis[v[j]]
                     || !vis[p1] || !vis[p2])
                    && (check(v[i], v[j], p1, p2))) {
  
                    vis[v[i]] = 1;
                    vis[v[j]] = 1;
                    vis[p1] = 1;
                    vis[p2] = 1;
                    ans++;
                }
            }
        }
    }
    cout << ans;
    return ans;
}
  
// Function to Count the number of squares
void countOfSquares(vector<pair<int, int> > v, int n)
{
    ios_base::sync_with_stdio(0);
    cin.tie(0);
  
    map<pair<int, int>, int> hash;
  
    // Declaring iterator to a vector
    vector<pair<int, int> >::iterator ptr;
  
    // Adding the points to hash
    for (ptr = v.begin(); ptr < v.end(); ptr++)
        hash[*ptr] = 1;
  
    // Count the number of squares
    count(hash, v, n);
}
  
// Driver Code
int main()
{
  
    int n = 5;
    vector<pair<int, int> > v;
    v.push_back(make_pair(0, 0));
    v.push_back(make_pair(0, 2));
    v.push_back(make_pair(2, 0));
    v.push_back(make_pair(2, 2));
    v.push_back(make_pair(0, 1));
  
    // Function call
    countOfSquares(v, n);
    return 0;
}
Producción:

1

Análisis de rendimiento:

  • Complejidad de tiempo: como en el enfoque anterior, hay dos bucles que requieren un tiempo O(N 2 ), por lo que la complejidad de tiempo será O(N 2 ) .
  • Complejidad del espacio auxiliar: como en el enfoque anterior, se utiliza espacio adicional, por lo que la complejidad del espacio auxiliar será O(N) .

Publicación traducida automáticamente

Artículo escrito por Dwngu 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 *