- 1

Grafos y Árboles: Estructuras de Datos Avanzadas
06:48 - 2

Estructuras de Datos: Introducción a Árboles y Sus Propiedades
07:12 - 3

Recursión: Concepto y Aplicaciones Prácticas con Ejemplos
09:11 - 4

Aplicaciones Prácticas de Grafos en Tecnología e Industria
05:16 - 5
Representación de Grafos: Matriz y Lista de Adyacencia
01:02
Propagación de Plagas en Matrices usando BFS en Java
Clase 29 de 52 • Curso de Algoritmos Avanzados: Grafos y Árboles
Contenido del curso
- 6

Búsqueda en Profundidad (DFS) en Árboles y Grafos
04:50 - 7

Implementación de DFS recursivo para búsqueda en árboles
12:10 - 8
Búsqueda en Profundidad (DFS) para Grafos: Enfoque Iterativo y Recursivo
01:27 - 9

Recorridos y Profundidad en Árboles Binarios y Enearios
07:09 - 10

Suma de Caminos en Árboles Binarios
02:05 - 11

Suma de Números de Raíz a Hoja en Árboles
07:32 - 12
Playground: Sum Root to Leaf Numbers
00:00 - 13

Implementación de Algoritmo DFS en Árboles Binarios con Golang
15:03 - 14

Resolución del Problema de Número de Islas con DFS
02:32 - 15

Conteo de Islas en Matrices con DFS
08:51 - 16
Playground: Number of Islands
00:00 - 17

Implementación de "Número de Islas" con Recursión en Python
10:18 - 18
Ejercicios Prácticos de Búsqueda en Profundidad (DFS)
02:22 - 19
Algoritmos de Búsqueda en Profundidad (DFS) en Problemas Comunes
06:19
- 20

Algoritmo BFS: Recorrido en Anchura de Grafos y Árboles
02:05 - 21

Implementación de BFS en Árboles usando Python
08:43 - 22

Movimiento mínimo de caballo en ajedrez infinito
02:55 - 23

Resolviendo el Problema Mínimo de Movimiento del Caballo en Ajedrez
08:11 - 24
Playground: Minimum Knights Moves
00:00 - 25

Resolución de Problemas de Caballos de Ajedrez con BFS en Python
17:49 - 26

Propagación de Plagas en Cultivos: Cálculo de Días para Contagio Total
03:50 - 27

Resolución de Rotting Oranges usando BFS
08:44 - 28
Playground: Rotting Oranges
00:00 - 29

Propagación de Plagas en Matrices usando BFS en Java
23:44 - 30

Construcción de Puentes Cortos entre Islas en Matrices Binarias
03:39 - 31

Resolución del Problema Shortest Bridge con DFS y BFS
07:36 - 32
Playground: Shortest Bridge Between Islands
00:00 - 33

Búsqueda del camino más corto entre islas usando BFS en Python
14:58 - 34
Búsqueda en anchura: Ejercicios prácticos y aplicaciones
03:41 - 35
Ejercicios avanzados de búsqueda en anchura (BFS) en programación
08:47
- 36

Algoritmo Backtracking: Solución de Problemas Complejos
04:21 - 37

Combinaciones de Letras en Números Telefónicos
01:52 - 38

Combinaciones de Letras a partir de un Número de Teléfono
09:20 - 39

Generación de combinaciones de letras con teclados numéricos en C++
14:08 - 40
Playground: Letter Combinations of a Phone Number
00:00 - 41

Generación de Direcciones IP Válidas a partir de Cadenas Numéricas
03:51 - 42

Generación de IPs válidas con backtracking en C++
28:17 - 43
Playground: Restore IP Addresses
00:00 - 44

Búsqueda de Palabras en Matrices: Solución y Complejidad
02:55 - 45

Búsqueda de Palabras en Matrices usando Backtracking y DFS
08:31 - 46
Playgrund: Word Search
00:00 - 47

Implementación de búsqueda de palabras en matrices con DFS en JavaScript
18:19 - 48
Resolución del problema de las n reinas en ajedrez
01:08 - 49
Ejercicios de Backtracking: Combinaciones y Permutaciones
01:05 - 50
Combinaciones y Permutaciones con Backtracking
02:14
¿Cómo implementar la lógica para determinar los días necesarios para que todas las plantas se pudran?
En el apasionante mundo de la programación, solemos enfrentarnos a problemas de lógica que buscan desafiar nuestra capacidad de abstracción y resolución de problemas. Un ejemplo interesante es el cálculo de los días necesarios para que todas las plantas de un cultivo modelado como una matriz se pudran. A continuación, se explica cómo puedes abordar este problema utilizando el lenguaje de programación Java, aunque es posible adaptarlo a tu lenguaje de preferencia.
¿Cuál es el caso base?
Antes que nada, es importante definir los casos base para evitar operaciones innecesarias:
- Si la matriz
cultivoes nula o no contiene valores, la respuesta será cero días, ya que no hay plantas que se puedan pudrir.
if (cultivo == null || cultivo.length == 0) return 0;
¿Por qué considerar frutas frescas?
El siguiente paso crucial es identificar las plantas frescas y podridas en el cultivo. Se utiliza un contador llamado cantidadFrescas que se incrementa por cada planta saludable:
int cantidadFrescas = 0;
for (int i = 0; i < cultivo.length; i++) {
for (int j = 0; j < cultivo[i].length; j++) {
if (cultivo[i][j] == 1) {
cantidadFrescas++;
}
}
}
¿Cómo se utiliza BFS para la propagación?
La técnica de búsqueda por amplitud (BFS) es ideal para propagar el estado de podredumbre de una planta a sus adyacentes:
-
Inicialización de la cola: Comienza agregando todas las posiciones que contienen plantas ya podridas. Estas se identifican con el valor 2.
-
Direcciones posibles: Las direcciones definidas permiten expandirse a los vecinos (arriba, abajo, izquierda, derecha).
-
Iteración BFS: Mientras la cola no esté vacía, itera sobre los elementos:
Queue<int[]> cola = new LinkedList<>();
for (int i = 0; i < cultivo.length; i++) {
for (int j = 0; j < cultivo[i].length; j++) {
if (cultivo[i][j] == 2) {
cola.offer(new int[]{i, j});
}
}
}
int[] direcciones = {{1, 0}, {-1, 0}, {0, 1}, {0, -1}};
while (!cola.isEmpty()) {
int size = cola.size();
for (int i = 0; i < size; i++) {
int[] pos = cola.poll();
int x = pos[0], y = pos[1];
for (int[] dir : direcciones) {
int nx = x + dir[0], ny = y + dir[1];
if (nx >= 0 && ny >= 0 && nx < cultivo.length && ny < cultivo[0].length && cultivo[nx][ny] == 1) {
cultivo[nx][ny] = 2; // Se pudrió
cola.offer(new int[]{nx, ny});
cantidadFrescas--;
}
}
}
}
¿Cuándo paramos la búsqueda?
Es determinante parar la búsqueda cuando una de las siguientes situaciones se da:
-
Todas las plantas están podridas: Si
cantidadFrescasllega a cero tras el proceso, se retorna el contador de niveles o días menos uno, dado que el último incremento en el ciclo BFS no cuenta como día completo. -
Existen plantas que no pueden pudrirse: Retorna -1 en caso de que aún existan frutas frescas sin pudrirse al concluir BFS.
return (cantidadFrescas == 0) ? dias - 1 : -1;
¿Por qué es importante practicar y adaptar?
Es vital aplicar estos conceptos en tu lenguaje favorito, ejecutar pruebas y validar diferentes escenarios para captar la lógica; estrategias como compartir tus soluciones y analizar las de otros te permiten crecer y mejorar tus habilidades en programación.
En resumen, resolver este problema implica comprender y aplicar estructuras de datos adecuadas, como colas y listas enlazadas, junto con técnicas de búsqueda. Es una gran oportunidad para afianzar tus habilidades de resolución de problemas y lógica algorítmica. ¡Sigue practicando y retroalimentándote para crecer como desarrollador!