J'adore vraiment les puzzles coulissants, mais récemment, je n'ai pas eu le temps pour eux. Par conséquent, j'ai besoin d'un programme pour me donner ma solution des puzzles de tuiles coulissantes, en particulier des puzzles Klotski.
Votre contribution sera au format suivant:
#######
#001gg#
##.222#
.######
où #
représente les murs, .
représente une zone ouverte, g
représente le but et les nombres adjacents représentent différents blocs. Vous pouvez supposer que:
- Il n'y aura pas plus de 10 blocs
- Il n'y aura pas deux blocs avec le même numéro
- Tous les blocs seront entourés de murs
- La grille est rectangulaire
- Le
0
bloc est suffisamment grand pour couvrir toutes les cases de but. - Il existe une solution valable
Vous devez renvoyer une séquence de mouvements qui mettra le 0
bloc de sorte qu'il couvre toutes les cases de but. Les blocs ne peuvent pas traverser des murs ou d'autres blocs. Pour le casse-tête ci-dessus, une séquence appropriée serait
2L,1R,1R,1D,0R,0R,0R
tandis que représente le déplacement du 2
bloc 1 carré vers la gauche, le 1
bloc 2 carrés vers la droite (en haut du but) puis 1 carré vers le bas, puis le 0
bloc 3 carrés vers la droite.
Il existe en fait plusieurs séquences qui fonctionneront pour le problème ci-dessus, et la production de l'une d'entre elles est acceptable. Votre solution doit être optimale, ce qui signifie qu'elle doit produire une séquence qui résout le casse-tête en un minimum d'étapes.
La séquence doit être imprimée comme ci-dessus, mais peut être séparée par des virgules, des sauts de ligne ou des espaces. Peu m'importe s'il y a des virgules ou des espaces. Vous devez produire la sortie dans un délai raisonnable (maximum 120 secondes sur les puzzles ci-dessous).
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#
######
C'est du code-golf, donc la solution la plus courte (en octets) l'emporte!
la source
Réponses:
Python, 1761
Un peu épuisé par cette question, donc je ne pouvais pas me résoudre à jouer au golf. Quoi qu'il en soit, en ce moment, c'est la seule solution qui résout tout dans le délai imparti (la plus longue, # 3, prend 27 secondes).
la source
JavaScript (ES6), 446
388Étendue Première recherche, la première solution trouvée est donc la plus courte.
Bien que je pense toujours que c'est une bonne solution, elle n'est pas suffisante. Même après avoir vérifié des millions de positions (plusieurs minutes d'exécution), je n'ai pas pu trouver de solution pour les exemples 2 et 3.
Modifier la version modifiée d' ES6 pour dépasser la limite de temps d'exécution javascript. Puzzle 3 résolu en 7min, 145 étapes. Puzzle 2 résolu en 10 minutes, 116 étapes
Edit 2 Big speedup, en utilisant l'idée de @ orlp de considérer comme égal deux blocs de même forme (à l'exclusion du bloc '0' qui est spécial). Cela réduit l'espace des positions visitées pendant BSF. Par exemple, pour le casse-tête 2, toute position avec les blocs 1, 2, 3 ou 5 échangés est vraiment la même.
Timing: le plus long est le puzzle 3, ~ 20 sec sur mon ordinateur portable.
Utilisez Firefox pour jouer avec le nouveau JsFiddle à tester.
Dépassé
EcmaScript 6 (FireFox) JSFiddleEcmaScript 5 (Chrome) JSFiddleExemple
Puzzle 1
Puzzle 2
Puzzle 3
Puzzle 4
la source