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

100 lines
3.5 KiB
Markdown

---
title: Flood Fill Algorithm
localeTitle: 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](https://github.com/firealex2/Codingame/blob/master/small%208%20grid%20paintefffd.png)
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:
```c++
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:
```c++
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).
```