Das 15-Puzzle ist ein berühmtes Puzzle, bei dem 15 Kacheln in einem 4x4-Raster verschoben werden. Ausgehend von einer zufälligen Konfiguration besteht das Ziel darin, die Kacheln in der richtigen Reihenfolge anzuordnen. Hier ist ein Beispiel eines gelösten 15-Puzzles:
01 02 03 04
05 06 07 08
09 10 11 12
13 14 15
Jede Bewegung des Puzzles hat die Form Auf / Ab / Links / Rechts. Die Bewegung "Nach unten" besteht darin, die Kachel, die sich über der leeren Stelle befindet, nach unten zu schieben. Der Zug "Rechts" besteht darin, ein Plättchen nach rechts in die leere Stelle zu schieben. So sieht das Board nach den Bewegungen nach unten und rechts aus.
01 02 03 04
05 06 07 08
09 10 11
13 14 15 12
Ziel dieser Herausforderung ist es, ein Programm zu schreiben, das die für die Lösung des 15-Puzzles erforderlichen Züge ausgibt. Der Gewinner ist das Programm, das die fünf Testfälle (siehe unten) in den wenigsten Zügen löst. Die generierte Lösung muss keine perfekte Lösung sein, sondern muss nur besser als die Konkurrenz sein. Für jeden einzelnen Testfall sollte das Programm auf einem vernünftigen Computer nicht länger als zehn Sekunden dauern.
Ihr Programm muss in der Lage sein, jedes lösbare Rätsel zu lösen. Ich benutze nur diese fünf Testfälle als Bewertung.
Ihr Programm erhält das ungelöste Puzzle als Eingabe im Format eines 2D-Arrays. Das 2D-Array kann entsprechend der verwendeten Sprache formatiert oder geändert werden, wenn die Sprache keine 2D-Arrays enthält. Das erste Element des ersten Unterarrays ist die Zahl oben links und das letzte Element des ersten Unterarrays ist die Zahl oben rechts. EIN0
wird der leere Raum sein.
Als Ausgabe sollte Ihr Programm eine Liste der Bewegungen in der Reihenfolge drucken, in der sie ausgeführt werden müssen. Jeder Schritt sollte nummeriert werden, um die Verwendbarkeit der Ergebnisse zu erhöhen.
BEARBEITEN: Basierend auf Kommentaren erlaube ich die Ausgabe entweder in Form von Ab / Auf / etc oder in Form der Koordinaten des zu bewegenden Stücks. Da dies kein Code-Golf ist, ist es das Wichtigste, das Rätsel zu lösen.
Einige andere allgemeine Regeln sehen vor, dass keine externen Quellen verwendet werden dürfen.
Testfall 1
([5,1,7,3],[9,2,11,4],[13,6,15,8],[0,10,14,12])
Beispielausgabe:
1: Down
2: Down
3: Down
4: Left
....
Testfall 2
([2,5,13,12],[1,0,3,15],[9,7,14,6],[10,11,8,4])
Testfall 3
([5,2,4,8],[10,0,3,14],[13,6,11,12],[1,15,9,7])
Testfall 4
([11,4,12,2],[5,10,3,15],[14,1,6,7],[0,9,8,13])
Testfall 5
([5,8,7,11],[1,6,12,2],[9,0,13,10],[14,3,4,15])
quelle
Antworten:
PyPy, 195 Züge, ~ 12 Sekunden Berechnung
Berechnet mithilfe von IDA * optimale Lösungen mit einer mit linearen Konflikten angereicherten "Walking Distance" -Heuristik. Hier sind die optimalen Lösungen:
Und der Code:
quelle
JavaScript (ES6) summiert die Schritte 329 für alle 5 Testfälle in ~ 1 Minute
Bearbeiten gleiche Strategie, verschiedene Ziele, eine bessere Lösung. Langsamer ...
So löse ich es quasi von Hand: Zwischenziele verwenden Nach jedem Ziel werden die relativen Kacheln nicht mehr verschoben. Jedes Zwischenziel wird mit einer parametrischen BSF-Funktion erreicht. Die 2 Parameter sind die Schleifenbedingung L (Wiederholen bei Wahr) und die Auswahlbedingung S (Auswählen, welche Kachel verschoben werden kann). Die Schritte:
Randnotiz Ich überprüfe nicht die Position der Kacheln 14 und 15. Unlösbare Rätsel wie
[11,4,12,2,,15,10,3,5,,14,1,6,7,,0,9,8,13]
haben 14 und 15 getauscht.Snippet zum Testen oder Spielen öffnen (nur Firefox)
Code-Snippet anzeigen
Testsuite In der Firefox / FireBug-Konsole
Ausgabe
quelle
Ich fing an, an diesem Problem zu arbeiten und wollte bisher mit meinem Code einen Beitrag leisten. Wie von Gareth angegeben, ist das Problem mit dem 8-Kachelpuzzle vergleichbar, und daher basiert der Code auf der großartigen Lösung von Keith Randall und damit in Python. Diese Lösung kann alle 5 Testfälle mit einer Gesamtsumme von weniger als 400 Zügen lösen und auch andere Rätsel. Es enthält eine optimierte und eine Brute-Force-Lösung. Der Code ist mittlerweile etwas aufgebläht. Die Ausgabe wird mit "llururd" abgekürzt. Hoffe, es ist hilfreich. http://www.penschuck.org/joomla/tmp/15Tile.txt (Erklärung) http://www.penschuck.org/joomla/tmp/tile15.txt (Python-Code)
quelle