Algoritmo de relleno por inundación explicado

El relleno por inundación es un algoritmo que se utiliza principalmente para determinar un área delimitada conectada a un nodo dado en una matriz multidimensional. Se parece mucho a la herramienta de cubo en los programas de pintura.

La implementación más abordada del algoritmo es una función recursiva basada en pila, y de eso es de lo que hablaremos a continuación.

¿Como funciona?

El problema es bastante simple y generalmente sigue estos pasos:

  1. Toma la posición del punto de partida.
  2. Decida si quiere ir en 4 direcciones ( N, S, W, E ) u 8 direcciones ( N, S, W, E, NW, NE, SW, SE ).
  3. Elija un color de reemplazo y un color de destino.
  4. Viaja en esas direcciones.
  5. Si la ficha en la que aterrizas es un objetivo, reemplázala con el color elegido.
  6. Repita 4 y 5 hasta que haya estado en todas partes dentro de los límites.

Tomemos la siguiente matriz como ejemplo:

texto alternativo

El cuadrado rojo es el punto de partida y los cuadrados grises son las llamadas paredes.

Para obtener más detalles, aquí hay un fragmento de código que describe la función:

int wall = -1; void flood_fill(int pos_x, int pos_y, int target_color, int color) 

Como se vio arriba, mi punto de partida es (4,4). Después de llamar a la función para las coordenadas de inicio x = 4 e y = 4 , puedo comenzar a verificar si no hay pared o color en el lugar. Si eso es válido, marco el lugar con un "color" y comienzo a comprobar los otros cuadrados adyacentes.

Yendo hacia el sur llegaremos al punto (5,4) y la función vuelve a ejecutarse.

Problema de ejercicio

Siempre consideré que resolver uno (o más) problemas utilizando un algoritmo recién aprendido es la mejor manera de comprender completamente el concepto.

Así que aquí tienes uno:

Declaración:

En una matriz bidimensional se le da n número de "islas" . Trate de encontrar el área más grande de una isla y el número de isla correspondiente. 0 marca agua y cualquier otra x entre 1 y n marca un cuadrado de la superficie correspondiente a la isla x.

Entrada

  • n - el número de islas.
  • l, c - las dimensiones de la matriz.
  • las siguientes l líneas, c números que dan la l- ésima fila de la matriz.

Salida

  • i - el número de la isla con el área más grande.
  • A - el área de la i 'ésima isla.

Ex:

Tienes la siguiente entrada:

2 4 4 0 0 0 1 0 0 1 1 0 0 0 2 2 2 2 2

Por lo que obtendrás la isla no. 2 como la isla más grande con el área de 5 cuadrados.

Sugerencias

El problema es bastante fácil, pero aquí hay algunas sugerencias:

1. Use the flood-fill algorithm whenever you encounter a new island. 2. As opposed to the sample code, you should go through the area of the island and not on the ocean (0 tiles).