100 lines
		
	
	
		
			3.5 KiB
		
	
	
	
		
			Markdown
		
	
	
	
	
	
		
		
			
		
	
	
			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: | ||
|  | 
 | ||
|  |  | ||
|  | 
 | ||
|  | 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).  | ||
|  | 
 | ||
|  | ``` |