Risolvere un labirinto tramoggia numero


18

Il mio bambino di 8 anni si è annoiato creando labirinti convenzionali e ha iniziato a creare varianti che assomigliano a questo:

Campione numero tramoggia

L'idea è di iniziare da x e raggiungere o tramite le normali regole. Inoltre, è possibile "saltare" da qualsiasi numero intero qualsiasi altro numero intero b , ma si deve pagare | a - b | dollari per il privilegio. L'obiettivo è risolvere il labirinto al minor costo. Nell'esempio sopra, potremmo passare da x a o via x-14-18-27-28-o al costo 5, ma è più economico andare x-13-11-9-8-29-28-o solo 4.ab|ab|

Quindi, ecco la mia domanda: qual è la migliore soluzione (in termini di tempo di esecuzione asintotico) che puoi pensare per risolvere questo? È possibile formulare ipotesi ragionevoli sul formato di input.

Nota: sto usando il tag "puzzle" qui perché ho in mente una risposta , ma non sono sicuro che sia ottimale e vorrei vedere se qualcun altro può migliorare la mia soluzione. (Qui n è il numero di numeri interi nel labirinto.)O(n2)n


7
Prop a tuo figlio per aver creato puzzle così creativi e matematici!
Bbejot,

2
@bbejot Dovresti vedere alcune delle cose che mi chiede ... a volte non riesco a rispondere alle sue domande. Ad esempio, math.stackexchange.com/questions/33094/…
Fixee,

1
Non sono sicuro che i calcoli dei costi siano corretti. x-14-18-27-28-o dovrebbe costare e x-13-11-9-8-29-28-o dovrebbe costare 2 + 2 + 1 + 21 + 1 = 27 . 4+9+1=142+2+1+21+1=27
Dave Clarke,

1
@Dave non tutte le transizioni sono salti. Potremmo scrivere 'ab' per i salti (che hanno un costo di ) e 'a-> b' per camminare nel grafico da a a b (che ha un costo di 0 ), che è consentito solo se sono raggiungibili senza rompere un muro nel labirinto. In questa notazione abbiamo x-> 14-18-> 27-28-> o e un costo di 5 e x-> 13-11-> 9-8-> 29-28-> o. Il sottile Fixee non ha introdotto questa notazione a causa della sua ridondanza: non c'è motivo di saltare due volte e così si alterneranno luppoli e passeggiate nel labirinto. |ab|0
Artem Kaznatcheev

2
Questo è un eccellente problema con i compiti!
Jeffε,

Risposte:


15

Puoi risolverlo in tempo usando una variante dell'algoritmo di Dijkstra. Possiamo evitare di non eseguire tutti gli aggiornamenti di distanza quando visitiamo un nuovo nodo. Se visitiamo un nodo y , abbiamo solo bisogno di aggiornare le distanze di tutto ciò che è percorribile da y a 0 e di aggiornare le distanze ai due nodi y - e y + con i valori più vicini a y minori e maggiori di y che non hanno stato ancora scelto.O(nlogn)yyyy+yy

Questi aggiornamenti sono sufficienti per mantenere l'heap che restituisce l'elemento minimo poiché qualsiasi nodo più vicino a cui si salta deve essere stato numericamente appena sopra o appena sotto un nodo già visitato.

yy+O(nlogn)O(n)O(nlogn)O(nlogn)


x1,,xnxo2xi2xi+1xixixi

O(nlgn)y+yO(nlgn)

O(nloglogn)O(n)

4

O(n2)

Sembra naturale convertirlo nel problema del percorso più breve con uno speciale nodo iniziale (x) e finale (0). Ci sarebbe anche un altro nodo per ciascuno dei numeri. Entrambi x e 0 hanno bordi di peso 0 rispetto a tutti i nodi numerici che sono raggiungibili nel labirinto. Tutti i nodi numerici sono collegati con il peso 0 (se i numeri sono raggiungibili dal labirinto) o con la differenza tra i numeri (se non il labirinto raggiungibile).

O(n2)n2O(n2)


O(n2)O(n2lgn)

1
rO(r2)

O(nlogn)O(r2+nlogn)Ω(nlogn)

Ω(n2)
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.