Encuentre la cantidad de polígonos que se encuentran dentro de cada polígono dado en el plano cartesiano

Dados N polígonos anidados que no se intersecan y una array 2D arr[][] de pares , donde cada celda de la array representa las coordenadas de los vértices de un polígono. La tarea es encontrar la cantidad de polígonos que se encuentran dentro de cada polígono.

Ejemplos:

Entrada: N = 3, array[][][] = {{{-2, 2}, {-1, 1}, {2, 2}, {2, -1}, {1, -2}, {-2, -2}}, {{-1, -1}, {1, -1}, {1, 1}}, {{3, 3}, {-3, 3}, {-3, -3}, {3, -3}}}
Salida: 1 0 2
Explicación:

  1. El polígono representado en el índice 0 es el polígono de color verde que se muestra en la imagen de arriba.
  2. El polígono representado en el índice 1 es el polígono de color azul que se muestra en la imagen de arriba.
  3. El polígono representado en el índice 2 es el polígono de color amarillo que se muestra en la imagen de arriba.

Por lo tanto, hay 1 polígono dentro del polígono de índice 0, 0 polígonos dentro del polígono de índice 1 y 2 polígonos dentro del polígono de índice 2.
 

Enfoque: El problema anterior se puede resolver con base en las siguientes observaciones:

  1. Se puede observar que el polígono que se encuentra afuera tendrá las coordenadas X más grandes . Las coordenadas X máximas del polígono disminuirán, ya que uno irá hacia el interior, dado que los polígonos están anidados y no se intersecan.
  2. Por lo tanto, ordenar los polígonos por la coordenada X máxima dará el orden correcto de los polígonos que se encuentran.

Siga los pasos a continuación para resolver el problema:

  • Inicialice una array 2D, por ejemplo , maximumX[][] de tamaño N*2 para almacenar el par de coordenadas X máximas de un polígono y el valor de índice del polígono.
  • Itere sobre la array arr[][] usando la variable, realizo los siguientes pasos:
    • Inicialice una variable, digamos maxX, para almacenar la coordenada X máxima del polígono actual .
    • Itere sobre la array arr[i] usando la variable j y en cada iteración actualice maxX como maxX = max(maxX, arr[i][j][0]).
    • Asigne el par {maxX, i} a maximumX[i].
  • Ordene la array de pares en orden descendente por el primer elemento utilizando un comparador personalizado.
  • Inicialice una array, digamos res[], para almacenar el recuento de polígonos que se encuentran dentro del polígono actual.
  • Itere sobre el rango [0, N-1] usando la variable i y en cada iteración asigne Ni-1 a res[maximumX[i][1]], ya que hay polígonos de Ni-1 dentro del máximoX[i][ 1] polígono .
  • Finalmente, después de completar los pasos anteriores, imprima la array res[] como respuesta.

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

C++

// C++ program for above approach
#include<bits/stdc++.h>
using namespace std;
 
// Function to calculate maximum sum
void findAllPolygons(int N,
                     vector<vector<vector<int> > > arr)
{
   
    // Stores the maximum X co-
    // ordinate of every polygon
    vector<pair<int, int> > maximumX(N);
 
    // Traverse the array arr[][]
    for (int i = 0; i < N; i++) {
 
        // Stores the max X co-
        // ordinate of current
        // polygon
        int maxX = INT_MIN;
 
        // Traverse over the vertices
        // of the current polygon
 
        for (int j = 0; j < arr[i].size(); j++) {
            // Update maxX
            maxX = max(maxX, arr[i][j][0]);
        }
 
        // Assign maxX to maximumX[i][0]
        maximumX[i].first = maxX;
 
        // Assign i to maximumX[i][1]
        maximumX[i].second = i;
    }
 
    // Sort the array of pairs
    // maximumX in descending
    // order by first element
    sort(maximumX.rbegin(), maximumX.rend());
 
    // Stores the count of
    // polygons lying inside
    // a polygon
    vector<int> res(N, 0);
 
    // Traverse the maximumX array
    for (int i = 0; i < N; i++) {
        // Update value at
        // maximumX[i][1] in
        // res
        res[maximumX[i].second] = N - 1 - i;
    }
 
    // Print the array array res
    for (int i = 0; i < N; i++) {
        cout << res[i] << " ";
        // System.out.print(res[i] + " ");
    }
}
 
// Driver Code
int main()
{
    int N = 3;
    vector<vector<vector<int> > > arr = {
        { { -2, 2 },
          { -1, 1 },
          { 2, 2 },
          { 2, -1 },
          { 1, -2 },
          { -2, -2 } },
        { { -1, -1 }, { 1, -1 }, { 1, 1 } },
        { { 3, 3 }, { -3, 3 }, { -3, -3 }, { 3, -3 } }
    };
 
    findAllPolygons(N, arr);
    return 0;
}
 
// The code is contributed by Gautam goel (gautamgoel962)

Java

// Java program for above approach
import java.util.*;
 
class GFG {
 
    // Function to sort a 2D
    // array using custom a comparator
    public static void sort2d(int[][] arr)
    {
        Arrays.sort(arr, new Comparator<int[]>() {
            public int compare(final int[] a,
                               final int[] b)
            {
                if (a[0] < b[0])
                    return 1;
                else
                    return -1;
            }
        });
    }
 
    // Function to calculate maximum sum
    static void findAllPolygons(int N,
                                int[][][] arr)
    {
        // Stores the maximum X co-
        // ordinate of every polygon
        int[][] maximumX = new int[N][2];
 
        // Traverse the array arr[][]
        for (int i = 0; i < N; i++) {
 
            // Stores the max X co-
            // ordinate of current
            // polygon
            int maxX = Integer.MIN_VALUE;
 
            // Traverse over the vertices
            // of the current polygon
 
            for (int j = 0; j < arr[i].length; j++) {
                // Update maxX
                maxX = Math.max(maxX, arr[i][j][0]);
            }
 
            // Assign maxX to maximumX[i][0]
            maximumX[i][0] = maxX;
 
            // Assign i to maximumX[i][1]
            maximumX[i][1] = i;
        }
 
        // Sort the array of pairs
        // maximumX in descending
        // order by first element
        sort2d(maximumX);
 
        // Stores the count of
        // polygons lying inside
        // a polygon
        int[] res = new int[N];
 
        // Traverse the maximumX array
        for (int i = 0; i < N; i++) {
            // Update value at
            // maximumX[i][1] in
            // res
            res[maximumX[i][1]] = N - 1 - i;
        }
 
        // Print the array array res
        for (int i = 0; i < N; i++) {
            System.out.print(res[i] + " ");
        }
    }
 
    // Driver Code
    public static void main(String[] args)
    {
 
        int N = 3;
        int[][][] arr = {
            { { -2, 2 }, { -1, 1 }, { 2, 2 }, { 2, -1 }, { 1, -2 }, { -2, -2 } },
            { { -1, -1 }, { 1, -1 }, { 1, 1 } },
            { { 3, 3 }, { -3, 3 }, { -3, -3 }, { 3, -3 } }
        };
 
        findAllPolygons(N, arr);
    }
}
Producción

1 0 2 

Complejidad de Tiempo: O(M + N log N), Donde M tamaño máximo de un polígono
Espacio Auxiliar: O(N)

Publicación traducida automáticamente

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