es.davy.ai

Preguntas y respuestas de programación confiables

¿Tienes una pregunta?

Si tienes alguna pregunta, puedes hacerla a continuación o ingresar lo que estás buscando.

¿Cómo puedo etiquetar los componentes conectados en APL?

Estoy tratando de resolver el rompecabezas leet en el siguiente enlace: https://leetcode.com/problems/max-area-of-island/, que requiere etiquetar componentes conectados (por lados, no esquinas).

¿Cómo puedo transformar algo como:

0 0 1 0 0
0 0 0 0 0
0 1 1 0 1
0 1 0 0 1
0 1 0 0 1

en

0 0 1 0 0
0 0 0 0 0
0 2 2 0 3
0 2 0 0 3
0 2 0 0 3

He probado con el operador de stencil “⌺” y también he intentado usar operadores de escaneo, pero aún no lo he logrado. ¿Alguien puede ayudarme?

Tags:  , ,

Answer

  1. Avatar for davy.ai

    Para etiquetar los componentes conectados por lados, no esquinas, puedes usar el siguiente algoritmo:

    1. Inicializa un contador de etiquetas en 1
    2. Para cada celda en la cuadrícula:
      a. Si la celda no es 1, continúa con la siguiente celda
      b. Si la celda es 1 y aún no está etiquetada, utiliza un algoritmo de relleno para etiquetar todas las celdas adyacentes con el contador de etiquetas actual
      c. Incrementa el contador de etiquetas en 1
    3. Devuelve la cuadrícula etiquetada

    Para la cuadrícula de ejemplo:

    0 0 1 0 0
    0 0 0 0 0
    0 1 1 0 1
    0 1 0 0 1
    0 1 0 0 1
    

    La cuadrícula etiquetada sería:

    0 0 1 0 0
    0 0 0 0 0
    0 2 2 0 3
    0 2 0 0 3
    0 2 0 0 3
    

    Para implementar este algoritmo en APL, puedes utilizar una combinación de operadores de estarcido y escaneo. Una posible implementación es:

    M ← 5 5⍴0 0 1 0 0 0 0 0 0 0 1 1 0 1 0 1 0 0 1 0 0 1 0 0
    L ← (⍳⍴M)∘.=⍳⍴M ⍝ inicializa la cuadrícula etiquetada con un número único para cada celda
    L[~M]←0  ⍝ establece en 0 todas las celdas que no pertenecen a la isla
    C ← 1   ⍝ inicializa el contador de etiquetas
    F ← {⍵∨.∧∘≠⌺3 3⊢⍺} ⍝ define la función de relleno utilizando el estarcido
    Lp←(0 ∘=L)⊣{C+←1 ⋄ ⍺F⍵⊣⍵ ← (C×M)×L=0}⍣≡L ⍝ aplica la función de relleno hasta la convergencia
    Lp÷C   ⍝ divide entre el contador de etiquetas para obtener las etiquetas finales
    

    El código anterior inicializa la cuadrícula etiquetada L con un número único para cada celda, establece en 0 todas las celdas que no pertenecen a la isla e inicializa el contador de etiquetas C en 1. La función de relleno F utiliza el operador de estarcido con un kernel de 3×3 para etiquetar las celdas adyacentes con el mismo número. El bucle principal aplica la función de relleno tantas veces como sea necesario hasta la convergencia, actualizando el contador de etiquetas y la cuadrícula etiquetada en cada iteración. Finalmente, el código divide la cuadrícula etiquetada entre el contador de etiquetas para obtener las etiquetas finales.

    Es importante tener en cuenta que esta implementación asume que la cuadrícula no tiene agujeros ni islas desconectadas dentro de la isla principal. Si este no es el caso, el algoritmo debe adaptarse para manejar múltiples islas.

Comments are closed.