Resolver un laberinto de la tolva numérica

18

Mi hijo de 8 años se ha aburrido creando laberintos convencionales y ha comenzado a crear variantes que se parecen a esto:

Muestra de número de tolva

La idea es comenzar desde x y alcanzar o a través de las reglas normales. Además, puede "saltar" de cualquier número entero a cualquier otro número entero , pero usted debe pagardólares por el privilegio. El objetivo es resolver el laberinto al menor costo. En el ejemplo anterior, podríamos ir de xo a través de x-14-18-27-28-o al costo 5, pero es más barato ir x-13-11-9-8-29-28-o por solo 4)b | a - b |ab|ab|

Así que aquí está mi pregunta: ¿cuál es la mejor solución (en términos de tiempo de ejecución asintótico) que se le ocurra para resolver esto? Puede hacer suposiciones razonables sobre el formato de entrada.

Nota: Estoy usando la etiqueta "rompecabezas" aquí porque tengo en mente una respuesta , pero no estoy seguro de que sea óptima y me gustaría ver si alguien más puede mejorar mi solución. (Aquí es el número de enteros en el laberinto).nO(n2)n

Fixee
fuente
77
¡Apoyos para su hijo para crear rompecabezas tan creativos y matemáticos!
bbejot
2
@bbejot Deberías ver algunas de las cosas que me pregunta ... a veces no puedo responder a sus preguntas. Por ejemplo, math.stackexchange.com/questions/33094/…
Fixee
1
No estoy seguro de que sus cálculos de costos sean correctos. x-14-18-27-28-o debería costar y x-13-11-9-8-29-28-o debería costar . 2 + 2 + 1 + 21 + 1 = 274+9+1=142+2+1+21+1=27
Dave Clarke
1
@Dave no todas las transiciones son saltos. Podríamos escribir 'ab' para saltos (que tienen un costo de ) y 'a-> b' para caminar en el gráfico de a a b (que tiene un costo de ), lo cual está permitido solo si son accesibles sin romper una pared en el laberinto. En esta notación tenemos x-> 14-18-> 27-28-> o y un costo de 5 yx-> 13-11-> 9-8-> 29-28-> o. Creo que Fixee no introdujo esta notación debido a que es redundante: no hay razón para saltar dos veces y, por lo tanto, los saltos y caminatas en el laberinto se alternarán. 0 0|ab|0
Artem Kaznatcheev
2
¡Este es un excelente problema de tarea!
Jeffε

Respuestas:

15

Puede resolver esto en tiempo usando una variación del algoritmo de Dijkstra. Podemos evitar no realizar todas las actualizaciones de distancia cuando visitamos un nuevo nodo. Si visitamos un nodo , solo necesitamos actualizar las distancias de todo lo que se puede caminar de a 0, y actualizar las distancias a los dos nodos e con los valores más cercanos a menos y mayores que que no tienen ha sido elegido todavía.y y y - y + y yO(nlogn)yyyy+yy

Estas actualizaciones son suficientes para mantener el montón devolviendo el elemento mínimo porque cualquier nodo más cercano al que salte debe haber estado numéricamente justo encima o justo debajo de un nodo ya visitado.

Cada nodo se actualiza a 0 como máximo una vez (si sacamos todos los nodos de distancia cero de la cola para evitar el comportamiento cuadrático), y cada vez que agregamos un nodo, solo hacemos O (1) otras actualizaciones. Encontrar los valores e se puede hacer en tiempo lineal si también mantenemos una lista ordenada doblemente vinculada de todos los nodos, ordenados por sus valores enteros. La creación de esta lista doblemente vinculada lleva tiempo , y finalmente el actualiza y aparece desde el montón, toma tiempo , para un tiempo de ejecución total dey + O ( n log n ) O ( n ) O ( n log n ) O ( n log n )yy+O(nlogn)O(n)O(nlogn)O(nlogn)

Dave
fuente
Probablemente esto se pueda mejorar un poco utilizando las colas de clasificación y prioridad que están especializadas para enteros, pero no puede hacerlo mejor que la clasificación de enteros, como se puede ver en la siguiente reducción: si tenemos una lista de valores enteros , establezca para que sea el doble del mínimo de estos y para que sea el doble del máximo. Cree una región con valores y entre sí . La mejor solución pasa por cada región en orden ordenado por , y por lo tanto produce una clasificación de los valores de . x o 2 x i 2 x i + 1 x i x i x ix1,,xnxo2xi2xi+1xixixi
Dave
O(nlgn)y+yO(nlgn)
O(nloglogn)O(n)
4

O(n2)

Parece natural convertir esto en el problema de la ruta más corta con un nodo inicial especial (x) y un nodo final (0). También habría otro nodo para cada uno de los números. Tanto x como 0 tienen bordes de peso 0 para todos los nodos de números que son accesibles en el laberinto. Todos los nodos numéricos están conectados con el peso 0 (si los números son accesibles por el laberinto) o con la diferencia entre los números (si no son accesibles por el laberinto).

O(n2)n2O(n2)

bbejot
fuente
O(n2)O(n2lgn)
1
rO(r2)
O(nlogn)O(r2+nlogn)Ω(nlogn)
Ω(n2)