Uhmm, creo que no va a ser fácil, pero vamos a tirar de IA a ver si te vale.
Para resolver el primer problema, puedes utilizar la siguiente rutina:
Código:
def calcular_distancias(puntos):
"""
Calcula las distancias entre todos los puntos de una lista.
Args:
puntos: Lista de puntos.
Returns:
Diccionario con las distancias entre todos los puntos.
"""
distancias = {}
for i in range(len(puntos)):
for j in range(i + 1, len(puntos)):
distancias[f"{puntos[i]}-{puntos[j]}"] = distance(puntos[i], puntos[j])
return distancias
def distance(p1, p2):
"""
Calcula la distancia entre dos puntos.
Args:
p1: Primer punto.
p2: Segundo punto.
Returns:
Distancia entre los dos puntos.
"""
x1, y1 = p1
x2, y2 = p2
return math.sqrt((x2 - x1)**2 + (y2 - y1)**2)
puntos = [(0, 0), (10, 0), (0, 10), (10, 10)]
distancias = calcular_distancias(puntos)
print(distancias)
Esta rutina crea un diccionario con las distancias entre todos los puntos de la lista. Para calcular la distancia entre dos puntos, utiliza la función distance(), que calcula la distancia euclidiana entre dos puntos.
Para resolver el segundo problema, puedes utilizar la siguiente rutina:
def calcular_ruta_mas_corta(puntos, pasillos):
"""
Calcula la ruta más corta entre dos puntos, utilizando solo los pasillos indicados.
Args:
puntos: Lista de puntos.
pasillos: Lista de pasillos.
Returns:
Lista con la ruta más corta entre los dos puntos.
"""
Convertimos los pasillos a un grafo.
grafo = {}
for pasillo in pasillos:
p1, p2 = pasillo
grafo.setdefault(p1, []).append(p2)
grafo.setdefault(p2, []).append(p1)
Inicializamos la distancia de cada punto a infinito.
distancias = {punto: float("inf") for punto in puntos}
distancias[puntos[0]] = 0
Inicializamos la cola de prioridad con el primer punto.
cola = [(0, puntos[0])]
Recorremos la cola hasta que esté vacía.
while cola:
# Sacamos el primer elemento de la cola.
Código:
dist, punto = cola.pop(0)
# Si el punto es el destino, lo hemos encontrado.
if punto == puntos[1]:
return distancias[punto]
# Recorremos todos los vecinos del punto.
for vecino in grafo[punto]:
# Si la distancia actual es mayor que la distancia al punto más la distancia al vecino, actualizamos la distancia.
if distancias[vecino] > distancias[punto] + 1:
distancias[vecino] = distancias[punto] + 1
cola.append((distancias[vecino], vecino))
Si llegamos aquí, no hay ruta entre los dos puntos.
return None
puntos = [(0, 0), (10, 0), (0, 10), (10, 10)]
pasillos = [(0, 1), (1, 2), (2, 3)]
ruta = calcular_ruta_mas_corta(puntos, pasillos)
print(ruta)
Esta rutina crea un grafo con los pasillos indicados. Luego, utiliza un algoritmo de búsqueda de Dijkstra para encontrar la ruta más corta entre los dos puntos.
Espero que esto te ayude.