Ich liebe es wirklich, Puzzles zu schieben, aber in letzter Zeit hatte ich keine Zeit dafür. Daher brauche ich ein Programm, mit dem ich meine Schiebepuzzlespiele, insbesondere Klotski-Puzzlespiele, reparieren kann.
Ihre Eingabe erfolgt in folgendem Format:
#######
#001gg#
##.222#
.######
wobei #
Wände darstellt, .
stellt einen offenen Bereich, g
stellt das Ziel, und benachbarte Zahlen repräsentieren verschiedene Blöcke. Sie können davon ausgehen, dass:
- Es wird nicht mehr als 10 Blöcke geben
- Es wird nicht zwei Blöcke mit der gleichen Nummer geben
- Alle Blöcke werden von Mauern umschlossen
- Das Raster ist rechteckig
- Der
0
Block ist groß genug, um alle Torfelder abzudecken. - Es gibt eine gültige Lösung
Sie müssen eine Folge von Zügen zurückgeben, mit denen der 0
Block alle Zielfelder abdeckt. Blöcke können keine Wände oder andere Blöcke passieren. Für das obige Puzzle wäre eine geeignete Reihenfolge
2L,1R,1R,1D,0R,0R,0R
Während das Verschieben des 2
Blocks 1 Quadrat nach links darstellt, wird der 1
Block 2 mit dem Quadrat nach rechts (über dem Tor), dann mit dem Quadrat nach unten und dann mit dem 0
Quadrat nach rechts mit dem Block 3 verschoben.
Tatsächlich gibt es mehrere Sequenzen, die für das obige Problem geeignet sind, und das Erzeugen einer von ihnen ist akzeptabel. Ihre Lösung sollte optimal sein, was bedeutet, dass eine Sequenz erstellt werden sollte, die das Rätsel in so wenigen Schritten wie möglich löst.
Die Sequenz sollte wie oben gedruckt werden, kann jedoch durch Kommas, Zeilenumbrüche oder Leerzeichen getrennt sein. Es ist mir egal, ob es nachgestellte Kommas oder Leerzeichen gibt. Sie sollten die Ausgabe in angemessener Zeit erstellen (maximal 120 Sekunden bei den unten aufgeführten Rätseln).
Puzzle 1:
..####..
..#00#..
###00###
#......#
#.1122.#
##3124##
.#3344#.
.##55##.
..#gg#..
..####..
Puzzle 2:
######
#1002#
#1002#
#3445#
#3675#
#8gg9#
######
Puzzle 3:
.####.
##1g##
#22g3#
#4255#
#4.56#
#.006#
#7008#
######
Puzzle 4:
.####.
##00##
#.00g#
#.0.1#
#..g2#
######
Das ist Code-Golf, also gewinnt die kürzeste Lösung (in Bytes)!
quelle
Antworten:
Python, 1761
Diese Frage ist irgendwie durchgebrannt, deshalb konnte ich mich nicht dazu bringen, Golf zu spielen. In beiden Fällen ist es derzeit die einzige Lösung, die alles innerhalb des Zeitlimits löst (die längste, Nummer 3, dauert 27 Sekunden).
quelle
JavaScript (ES6), 446
388Breite erste Suche, daher ist die erste gefundene Lösung die kürzeste.
Ich denke immer noch, dass das eine gute Lösung ist, aber es ist nicht gut genug. Selbst nachdem ich Millionen von Positionen überprüft hatte (Laufzeit mehrere Minuten), konnte ich keine Lösung für Beispiel 2 und 3 finden.
Bearbeiten Sie die von ES6 geänderte Version , um das Zeitlimit für die Ausführung von JavaScript zu überschreiten. Puzzle 3 in 7 Minuten, 145 Schritten gelöst. Puzzle 2 gelöst in 10min, 116 Schritten
Bearbeiten Sie 2 Big speedup, indem Sie die Idee von @ orlp verwenden, gleich zwei Blöcke mit derselben Form zu betrachten (mit Ausnahme des speziellen Blocks '0'). Dies reduziert den Platz der besuchten Positionen während der BSF. Zum Beispiel ist für Puzzle 2 jede Position mit ausgetauschten Blöcken 1, 2, 3 oder 5 wirklich dieselbe.
Timing: Das längste ist Puzzle 3, ~ 20 Sek. Auf meinem Laptop.
Verwenden Sie Firefox, um mit dem neuen JsFiddle zu spielen und zu testen.
Veraltet
EcmaScript 6 (FireFox) JSFiddleEcmaScript 5 (Chrome) JSFiddleBeispiel
Puzzle 1
Puzzle 2
Puzzle 3
Puzzle 4
quelle