Introducción

1

Grafos y Árboles: Estructuras de Datos Avanzadas

2

Estructuras de Datos: Introducción a Árboles y Sus Propiedades

3

Recursión: Concepto y Aplicaciones Prácticas con Ejemplos

4

Aplicaciones Prácticas de Grafos en Tecnología e Industria

5

Representación de Grafos: Matriz y Lista de Adyacencia

DFS

6

Búsqueda en Profundidad (DFS) en Árboles y Grafos

7

Implementación de DFS recursivo para búsqueda en árboles

8

Búsqueda en Profundidad (DFS) para Grafos: Enfoque Iterativo y Recursivo

9

Recorridos y Profundidad en Árboles Binarios y Enearios

10

Suma de Caminos en Árboles Binarios

11

Suma de Números de Raíz a Hoja en Árboles

12

Playground: Sum Root to Leaf Numbers

13

Implementación de Algoritmo DFS en Árboles Binarios con Golang

14

Resolución del Problema de Número de Islas con DFS

15

Conteo de Islas en Matrices con DFS

16

Playground: Number of Islands

17

Implementación de "Número de Islas" con Recursión en Python

18

Ejercicios Prácticos de Búsqueda en Profundidad (DFS)

19

Algoritmos de Búsqueda en Profundidad (DFS) en Problemas Comunes

BFS

20

Algoritmo BFS: Recorrido en Anchura de Grafos y Árboles

21

Implementación de BFS en Árboles usando Python

22

Movimiento mínimo de caballo en ajedrez infinito

23

Resolviendo el Problema Mínimo de Movimiento del Caballo en Ajedrez

24

Playground: Minimum Knights Moves

25

Resolución de Problemas de Caballos de Ajedrez con BFS en Python

26

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

27

Resolución de Rotting Oranges usando BFS

28

Playground: Rotting Oranges

29

Propagación de Plagas en Matrices usando BFS en Java

30

Construcción de Puentes Cortos entre Islas en Matrices Binarias

31

Resolución del Problema Shortest Bridge con DFS y BFS

32

Playground: Shortest Bridge Between Islands

33

Búsqueda del camino más corto entre islas usando BFS en Python

34

Búsqueda en anchura: Ejercicios prácticos y aplicaciones

35

Ejercicios avanzados de búsqueda en anchura (BFS) en programación

Backtrack

36

Algoritmo Backtracking: Solución de Problemas Complejos

37

Combinaciones de Letras en Números Telefónicos

38

Combinaciones de Letras a partir de un Número de Teléfono

39

Generación de combinaciones de letras con teclados numéricos en C++

40

Playground: Letter Combinations of a Phone Number

41

Generación de Direcciones IP Válidas a partir de Cadenas Numéricas

42

Generación de IPs válidas con backtracking en C++

43

Playground: Restore IP Addresses

44

Búsqueda de Palabras en Matrices: Solución y Complejidad

45

Búsqueda de Palabras en Matrices usando Backtracking y DFS

46

Playgrund: Word Search

47

Implementación de búsqueda de palabras en matrices con DFS en JavaScript

48

Resolución del problema de las n reinas en ajedrez

49

Ejercicios de Backtracking: Combinaciones y Permutaciones

50

Combinaciones y Permutaciones con Backtracking

Próximos pasos

51

Algoritmos de Grafos: MIN/MAX-HIP, TRI, Topological Sort y Dijkstra

52

Algoritmos y Estructuras de Datos en la Ingeniería

No tienes acceso a esta clase

¡Continúa aprendiendo! Únete y comienza a potenciar tu carrera

Resolviendo el Problema Mínimo de Movimiento del Caballo en Ajedrez

23/52
Recursos

¿Qué es el problema "Knight's Move" y cómo se resuelve?

El problema "Knight's Move" se centra en determinar el número mínimo de saltos que un caballo de ajedrez necesita para moverse de una posición inicial a una de destino en un tablero de ajedrez infinito. Dado que el caballo tiene un modo particular de movimiento, entender cómo se mueve es clave para resolver este desafío.

¿Cómo se mueve el caballo en ajedrez?

El caballo tiene un movimiento único: puede ir dos casillas en una dirección y una casilla en una dirección perpendicular, formando una "L". Las ocho posiciones posibles a las que un caballo puede moverse desde una casilla podrían representarse como:

  • (+2, +1), (+2, -1)
  • (-2, +1), (-2, -1)
  • (+1, +2), (+1, -2)
  • (-1, +2), (-1, -2)

¿Cómo abordamos este problema?

Este problema puede ser tratado como un grafo donde cada casilla representa un "nodo" con conexiones a otras casillas alcanzables según el movimiento del caballo. El objetivo es determinar el número mínimo de saltos (pasos) para llegar a la posición deseada.

¿Qué es BFS y por qué es relevante aquí?

BFS, o búsqueda en anchura, es un algoritmo utilizado para explorar nodos y sus vecinos por niveles. En el contexto del problema, podemos usar BFS para asegurar que encontramos el camino más corto (mínimo número de saltos) debido a su naturaleza de explorar nodos más cercanos antes que más lejanos.

A continuación se presenta un seudocódigo simplificado de cómo podríamos implementar BFS para resolver el problema:

from collections import deque

def min_knight_moves(start, target):
    # Movimientos del caballo
    moves = [(2, 1), (2, -1), (-2, 1), (-2, -1), (1, 2), (1, -2), (-1, 2), (-1, -2)]
    
    # Cola para BFS y HashSet para asegurar que no revisemos posiciones repetidas
    queue = deque([(start, 0)])
    visited = set()
    
    while queue:
        (x, y), steps = queue.popleft()
        
        # Verificar si llegamos al destino
        if (x, y) == target:
            return steps
        
        # Añadir a los siguientes posibles movimientos si no se han visitado
        for dx, dy in moves:
            new_pos = (x + dx, y + dy)
            
            if new_pos not in visited:
                visited.add(new_pos)
                queue.append((new_pos, steps + 1))

# Ejemplo de uso
start_pos = (0, 0)
target_pos = (4, 5)
print(min_knight_moves(start_pos, target_pos))

En este seudocódigo, mantenemos un conjunto visited para evitar procesar múltiples veces la misma posición, mejorando así la eficiencia.

Recomendaciones prácticas y consejos

  1. Comprender el movimiento del caballo: Antes de implementar, asegúrate de tener claras las ocho posibles orientaciones del movimiento del caballo.

  2. Utilizar estructuras adecuadas: Las estructuras de datos como deque y set son cruciales para una correcta y eficiente implementación de BFS.

  3. Optimización: Aunque BFS es efectivo, siempre es bueno estar abierto a nuevas ideas y optimizaciones. Invitamos a discutir posibles mejoras ya sea en complejidad temporal o espacial.

Aprender a implementar y optimizar algoritmos mediante ejemplos como este no solo mejora las habilidades de resolución de problemas, sino que también abre puertas a comprender estructuras de datos más complejas. ¡Continúa explorando y desafiando tus límites en cada lección!

Aportes 3

Preguntas 0

Ordenar por:

¿Quieres ver más aportes, preguntas y respuestas de la comunidad?

No es el mas efectivo pero es trabajo honesto :V

import math

MOVEMENTS = [
    (2, 1), (1, 2), (-2, 1), (-1, 2),
    (2, -1), (1, -2), (-2, -1), (-1, -2)
]


def distance_between_points(x1, y1, x2, y2):
    return math.sqrt((x2 - x1) ** 2 + (y2 - y1) ** 2)


def move_point(x: int, y: int, search_point: tuple, previous_point, previous_distance=0):
    list_possible_moves = []
    for movement_index in range(0, len(MOVEMENTS)):
        next_x = x + MOVEMENTS[movement_index][0]
        next_y = y + MOVEMENTS[movement_index][1]
        distance = distance_between_points(next_x, next_y, search_point[0], search_point[1])
        if distance == 0:
            return None
        if (next_x >= search_point[0] and next_y >= search_point[1]) \
                or (distance > distance_between_points(0, 0, search_point[0], search_point[1])):
            continue

        list_possible_moves.append([next_x, next_y, previous_distance + distance, previous_point + [(next_x, next_y)]])
    list_possible_moves.sort(key=lambda x: x[2])
    return list_possible_moves


def horse_steps(x, y):
    initial = [[0, 0]]
    jumps = 1
    while jumps < 1000:
        jumps = jumps + 1
        next_step = []
        for step in initial:
            response = move_point(x=step[0], y=step[1], search_point=(x, y), previous_point=[(step[0], step[1])])
            if response is None:
                return jumps
            next_step = next_step + response
            if next_step is None:
                print('No more steps')
                break
            initial = next_step


if __name__ == '__main__':
    assert horse_steps(2, 1) == 2
    assert horse_steps(5, 5) == 5
    assert horse_steps(5, 0) == 4

código en Python: `from queue import Queue` `from typing import List` `class Solution:` ` def minimum_knight_moves(self, target: List[int]) -> int:` ` # The knight moves in 8 possible directions` ` directions = [` ` (2, 1), (2, -1), (-2, 1), (-2, -1),` ` (1, 2), (1, -2), (-1, 2), (-1, -2)` ` ]` ` queue = Queue()` ` queue.put((0, 0, 0)) # (current_x, current_y, step_count)` ` visited_positions = set()` ` visited_positions.add((0, 0))` ` target_x, target_y = abs(target[0]), abs(target[1])` ` # BFS algorithm` ` while not queue.empty():` ` # Dequeue the next position and step count to be processed` ` current_x, current_y, current_steps = queue.get()` ` # Check if we've reached the target position` ` if current_x == target_x and current_y == target_y:` ` return current_steps` ` # Explore all possible knight moves` ` for dx, dy in directions:` ` new_x = current_x + dx` ` new_y = current_y + dy` ` new_position = (abs(new_x), abs(new_y))` ` # Check if the new position has been visited` ` if new_position not in visited_positions:` ` visited_positions.add(new_position)` ` queue.put((new_x, new_y, current_steps + 1))` `# Example usage:` `solution = Solution()` `print(solution.minimum_knight_moves([2, 1])) # Output: 1` `print(solution.minimum_knight_moves([5, 5])) # Output: 4`
Esta es mi solución en java, no estoy seguro de si es la mas eficiente (ya que para cada nivel calcula todas las nuevas posiciones posibles posibles) pero funciona, ¿alguna recomendación? ```js public class MinimumKnightsMoves { public static void main(String[] args) { System.out.println("Welcome to Minimum knights moves!"); System.out.println("in here you can calculate the minimum moves a chess knight needs to move from x,y point to another coordinates in an infinite chess board."); System.out.print("please insert the x coordinate for the initial position: "); final int startX = scanner.nextInt(); System.out.print("please insert the y coordinate for the initial position: "); final int startY = scanner.nextInt(); System.out.println("now you need to insert the destination coordinates..."); System.out.print("insert the x destination coordinate: "); final int destinationX = scanner.nextInt(); System.out.print("insert the y destination coordinate: "); final int destinationY = scanner.nextInt(); System.out.printf("the minimum moves to move from [%d,%d] to [%d,%d] are: [%d]", startX, startY, destinationX, destinationY, calculateMoves(startX, startY, destinationX, destinationY)); } private static int calculateMoves(int startX, int startY, int destinationX, int destinationY) { int moves = 0; if(startX == destinationX && startY == destinationY){ return moves; } Queue<int[]> movements = getPossibleMovementsForKnight(startX, startY); while(!movements.isEmpty()){ moves++; Queue<int[]> newMovements = new LinkedList<>(); while(!movements.isEmpty()) { int[] actualMove = movements.poll(); if (actualMove[0] == destinationX && actualMove[1] == destinationY) { return moves; } newMovements.addAll(getPossibleMovementsForKnight(actualMove[0], actualMove[1])); } movements.addAll(newMovements); } return moves; } private static Queue<int[]> getPossibleMovementsForKnight(int startX, int startY) { System.out.printf("Possible movements for knight at [%d,%d] are: \n", startX, startY); Queue<int[]> moves = new LinkedList<>(); moves.add(new int[] {startX + 2, startY + 1}); System.out.printf("\t [%d,%d]\n", startX + 2, startY + 1); moves.add(new int[] {startX + 1, startY + 2}); System.out.printf("\t [%d,%d]\n", startX + 1, startY + 2); moves.add(new int[] {startX - 2, startY + 1}); System.out.printf("\t [%d,%d]\n", startX - 2, startY + 1); moves.add(new int[] {startX - 1, startY + 2}); System.out.printf("\t [%d,%d]\n", startX - 1, startY + 2); moves.add(new int[] {startX + 2, startY - 1}); System.out.printf("\t [%d,%d]\n", startX + 2, startY - 1); moves.add(new int[] {startX + 1, startY - 2}); System.out.printf("\t [%d,%d]\n", startX + 1, startY - 2); moves.add(new int[] {startX - 2, startY - 1}); System.out.printf("\t [%d,%d]\n", startX - 2, startY - 1); moves.add(new int[] {startX - 1, startY - 2}); System.out.printf("\t [%d,%d]\n", startX - 1, startY - 2); return moves; } } ```