Contenido del curso

DFS

BFS

Backtrack

Minimum Knight's Move con BFS

Resumen

El problema Minimum Knight's Move plantea un reto clásico de algoritmos: dado un caballo en un tablero de ajedrez infinito, calcular la cantidad mínima de saltos necesarios para llegar desde una posición de origen hasta una de destino. La clave está en pensar el tablero como un grafo y aplicar Breadth First Search (BFS) para encontrar la ruta más corta.

¿Por qué un tablero de ajedrez se puede tratar como un grafo?

Cada casilla del tablero funciona como un nodo. Lo interesante es que las conexiones entre nodos no son las casillas contiguas, como pasaría con un peón, sino las casillas que respetan el movimiento en L del caballo.

Desde la posición donde está el caballo, los nodos vecinos son las ocho casillas a las que puede saltar siguiendo su patrón característico. Esa relación entre casilla y vecinos es exactamente lo que define un grafo.

¿Qué es BFS y por qué sirve aquí? Breadth First Search recorre un grafo por niveles, explorando primero todos los vecinos cercanos antes de avanzar a los lejanos. Por eso garantiza encontrar el camino más corto en número de saltos.

¿Cómo se modelan los movimientos del caballo en código?

El caballo tiene ocho direcciones posibles desde cualquier casilla [1:30]. Para representarlas, sumas o restas a las coordenadas actuales siguiendo este patrón:

  • En X suma 2 o -2, y en Y suma 1 o -1.
  • En X suma 1 o -1, y en Y suma 2 o -2.

Esas combinaciones generan los ocho saltos posibles. Cada salto que haces te lleva a un nuevo nodo, y desde ese nodo se abren otras ocho posibilidades.

¿Cómo aplicar BFS para contar la mínima cantidad de saltos?

La idea es avanzar por niveles desde el origen [1:50]. El nivel uno son las ocho casillas alcanzables en un solo salto. El nivel dos son las casillas alcanzables desde esas primeras ocho, y así sucesivamente.

La primera vez que el destino aparezca en alguno de los niveles, ese número de nivel es la respuesta. Como BFS explora por capas, garantizas que ningún camino más corto pasó desapercibido.

¿Qué estructuras de datos necesitas para resolverlo?

Dos estructuras hacen el trabajo pesado: una queue y un hash set. Cada una cumple un rol específico dentro del recorrido.

La queue respeta el principio FIFO, donde el primer elemento que entra es el primero que sale [3:30]. Eso es justo lo que necesitas para procesar primero las casillas de niveles cercanos antes que las de niveles lejanos. No puedes llegar a una coordenada lejana sin haber pasado por las cercanas primero.

El hash set almacena las casillas ya visitadas. Su utilidad es enorme porque consultar si un elemento existe en un hash set tiene complejidad O(1) [3:00]. Sin esta verificación, el caballo podría regresar infinitamente a casillas anteriores y nunca terminar.

¿Por qué usar un hash set en vez de una lista? Porque revisar pertenencia en una lista es O(n), mientras que en un hash set es O(1). Esa diferencia evita que el algoritmo se vuelva lento al crecer el tablero.

¿Cómo se combinan queue y hash set durante el recorrido?

El flujo funciona así de claro:

  1. Sacas la casilla al frente de la queue.
  2. Generas las ocho casillas vecinas según el movimiento del caballo.
  3. Por cada vecina, revisas si ya está en el hash set. Si no, la agregas al set y al final de la queue.
  4. Repites hasta que la casilla destino aparezca.

Cada iteración remueve la dirección actual y suma las nuevas al final de la cola. Así mantienes el orden por niveles que BFS necesita.

¿Cuál es la complejidad temporal y espacial de esta solución?

La complejidad espacial es O(n), donde n es la cantidad de pasos posibles que se exploran hasta llegar al destino [4:30]. La cola puede crecer bastante, sobre todo cuando el destino está lejos del origen.

Es una complejidad alta, pero razonable considerando que estás haciendo BFS sobre un tablero infinito. Cada nivel multiplica las posibilidades, y el hash set evita recalcular casillas ya vistas, lo que mantiene el algoritmo viable.

¿Existen soluciones más eficientes que BFS para este problema?

BFS resuelve correctamente el problema, pero no siempre es la opción óptima. Existen aproximaciones matemáticas o BFS bidireccional que pueden mejorar tanto el tiempo como la memoria utilizada.

Si tienes una propuesta con mejor complejidad, compártela en los comentarios. ¿Qué enfoque alternativo se te ocurre para reducir la cantidad de casillas exploradas?