freeCodeCamp/guide/spanish/algorithms/flood-fill/index.md

3.5 KiB

title localeTitle
Flood Fill Algorithm Algoritmo de relleno de inundación

Algoritmo de relleno de inundación

El relleno de inundación es un algoritmo utilizado principalmente para determinar un área limitada conectada a un nodo determinado en una matriz multidimensional. Es un parecido cercano a la herramienta de cubeta en programas de pintura.

La implementación más aproximada del algoritmo es una función recursiva basada en pila, y de eso vamos a hablar siguiente.

¿Como funciona?

El problema es bastante simple y generalmente sigue estos pasos:

  1. Tomar la posición del punto de partida.
  2. Decida si desea 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 caes es un objetivo, reaplícala con el color elegido.
  6. Repita 4 y 5 hasta que haya estado en todas partes dentro de los límites.

Tomemos como ejemplo la siguiente matriz:

texto alternativo

El cuadrado rojo es el punto de partida y los cuadrados grises son los llamados muros.

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

int wall = -1; 
 
 void flood_fill(int pos_x, int pos_y, int target_color, int color) 
 { 
 
   if(a[pos_x][pos_y] == wall || a[pos_x][pos_y] == color) // if there is no wall or if i haven't been there 
      return;                                              // already go back 
 
   if(a[pos_x][pos_y] != target_color) // if it's not color go back 
      return; 
 
   a[pos_x][pos_y] = color; // mark the point so that I know if I passed through it. 
 
   flood_fill(pos_x + 1, pos_y, color);  // then i can either go south 
   flood_fill(pos_x - 1, pos_y, color);  // or north 
   flood_fill(pos_x, pos_y + 1, color);  // or east 
   flood_fill(pos_x, pos_y - 1, color);  // or west 
 
   return; 
 
 } 

Como se ve 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, señalo el lugar con un "color" y comienza a revisar los otros cuadrados adiacentes.

Hacia el sur llegaremos al punto (5,4) y la función se ejecutará de nuevo.

Problema de ejercicio

Siempre consideré que resolver un (o más) problema (s) usando un algoritmo recién aprendido es la mejor manera de entenderlo. el concepto.

Así que aquí está uno:

Declaración:

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

Entrada

  • n - el número de islas.
  • l, c - las dimensiones de la matriz.
  • los próximos l líneas, números c dando el l º fila de la matriz.

Salida

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

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á la isla no. 2 como la isla más grande con el área de 5 plazas.

Consejos

El problema es bastante fácil, pero aquí hay algunos consejos:

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).