- 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
Búsqueda de Palabras en Matrices usando Backtracking y DFS
Clase 45 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 resolver el problema de búsqueda de palabras en matrices?
En esta clase abordaremos un problema interesante en programación: la búsqueda de palabras en matrices. Imagina un tablero lleno de letras, de las cuales debes determinar si una palabra está formada por letras adyacentes. Es un desafío que puede parecer similar a un crucigrama, pero aquí las palabras pueden formarse en cualquier dirección adyacente, no solo en líneas horizontales o verticales. Esto hace más complejo el proceso, pero, precisamente, es lo que lo hace interesante. ¡Explorémoslo!
¿Qué técnicas podemos usar para resolverlo?
Para enfrentar este desafío, nos apoyaremos principalmente en dos técnicas fundamentales de programación: el DFS (Depth First Search) o búsqueda en profundidad, y el backtracking.
-
DFS (Depth First Search): Ayuda a explorar todos los posibles caminos en la matriz para formar la palabra. A medida que avanzamos por cada letra, podríamos profundizar en diferentes caminos, verificando cada letra adyacente para continuar o descartar un camino si deja de coincidir con la palabra que buscamos.
-
Backtracking: Esto nos permite "deshacer" nuestros pasos cuando un camino no lleva al resultado deseado. Al retroceder, evaluamos otros caminos posibles sin tener que empezar desde cero nuevamente.
¿Cómo podemos definir direcciones adyacentes?
Al enfrentar este problema, determinar las direcciones consideradas adyacentes es crucial. Normalmente consideraríamos:
- Adyacentes horizontales (izquierda y derecha).
- Adyacentes verticales (arriba y abajo).
- Cámara diagonal, en caso de que se permita en la especificación.
Saber qué direcciones son válidas nos ayuda a decidir los siguientes pasos cuando estamos en un nodo o letra actual.
¿Cómo evitamos reutilizar las mismas letras?
Un aspecto importante en la búsqueda de palabras es asegurar que una misma letra no se use más de una vez en la formación de una palabra. Esto se podría gestionar de diferentes maneras:
-
Marcado de letras usadas: Se puede usar una lista o conjunto que registre las letras utilizadas hasta el momento. Sin embargo, esta opción puede ser costosa en términos de espacio.
-
Reemplazo temporal de caracteres: Una solución más eficiente es reemplazar temporalmente una letra utilizada con un carácter que sabemos que no formará parte de ninguna palabra, como un numeral (#). Esto permite marcar una letra como en uso sin reservar espacio adicional.
# Ejemplo de implementación en Python def buscar_palabra(matriz, palabra): def dfs(x, y, índice): if índice == len(palabra): return True if (x < 0 or x >= len(matriz) or y < 0 or y >= len(matriz[0]) or matriz[x][y] != palabra[índice]): return False tmp, matriz[x][y] = matriz[x][y], '#' resultado = (dfs(x+1, y, índice+1) or dfs(x-1, y, índice+1) or dfs(x, y+1, índice+1) or dfs(x, y-1, índice+1)) matriz[x][y] = tmp return resultado for i in range(len(matriz)): for j in range(len(matriz[0])): if dfs(i, j, 0): return True return False
En este código, utilizamos DFS para recorrer la matriz, reemplazando temporalmente las letras utilizadas con # y restaurando su valor original al retroceder. Este método permite gestionar con eficiencia el marcado de letras utilizadas sin requerir estructuras de datos adicionales.
¿Qué hacer si la palabra no está?
Finalmente, si todas las exploraciones en la matriz no logran formar la palabra, retornamos falso. En el peor de los casos, recorremos toda la matriz, lo que hace que la complejidad temporal sea (O(n^2)), donde n es el número de elementos en la matriz.
Esperamos que esta explicación te haya dado una buena perspectiva sobre cómo resolver el problema de búsqueda de palabras en matrices. Es un tema que involucra conceptos clave en algoritmos que pueden aplicarse a una variedad de problemas. Te animamos a experimentar y encontrar tus propias soluciones innovadoras. ¡Hasta la próxima lección!