Le 15 Puzzle est un puzzle célèbre impliquant le glissement de 15 tuiles sur une grille 4x4. Partant d'une configuration aléatoire, l'objectif est de disposer les tuiles dans le bon ordre. Voici un exemple d'un puzzle résolu 15:
01 02 03 04
05 06 07 08
09 10 11 12
13 14 15
Chaque mouvement du puzzle est de la forme Haut / Bas / Gauche / Droite. Le mouvement "Down" consiste à faire glisser la tuile qui se trouve au-dessus de la case vide vers le bas. Le mouvement "Droite" consiste à faire glisser une tuile vers la droite, dans la case vide. Voici à quoi ressemble le plateau après les mouvements vers le bas et vers la droite.
01 02 03 04
05 06 07 08
09 10 11
13 14 15 12
Le but de ce défi est d'écrire un programme qui peut produire la série de mouvements nécessaires pour résoudre le 15 Puzzle. Le gagnant est le programme qui résout les cinq cas de test (ci-dessous) en un minimum de mouvements. La solution générée n'a pas besoin d'être une solution parfaite, elle doit simplement être meilleure que les concurrents. Pour chaque cas de test individuel, le programme ne devrait pas prendre plus de dix secondes sur une machine raisonnable.
Votre programme doit être capable de résoudre n'importe quel casse-tête qui est résoluble, j'utilise simplement ces cinq cas de test comme pointage.
Votre programme recevra le puzzle 15 non résolu en entrée au format d'un tableau 2D. Le tableau 2D peut être formaté en fonction de la langue utilisée ou modifié si la langue ne possède pas de tableaux 2D. Le premier élément du premier sous-tableau sera le numéro en haut à gauche et le dernier élément du premier sous-tableau sera le numéro en haut à droite. A 0
sera l'espace vide.
En sortie, votre programme doit imprimer une liste de mouvements dans l'ordre dans lequel ils doivent être effectués. Chaque étape doit être numérotée afin d'augmenter l'utilisabilité des résultats.
EDIT: Sur la base des commentaires, je permettrai que la sortie soit sous la forme Down / Up / etc ou sous la forme des coordonnées de la pièce à déplacer. Comme ce n'est pas du golf de code, la partie la plus importante est de résoudre le puzzle.
Certaines autres règles générales n'impliquent pas l'utilisation d'une source externe, etc.
Cas de test 1
([5,1,7,3],[9,2,11,4],[13,6,15,8],[0,10,14,12])
Exemple de sortie:
1: Down
2: Down
3: Down
4: Left
....
Cas de test 2
([2,5,13,12],[1,0,3,15],[9,7,14,6],[10,11,8,4])
Cas de test 3
([5,2,4,8],[10,0,3,14],[13,6,11,12],[1,15,9,7])
Cas de test 4
([11,4,12,2],[5,10,3,15],[14,1,6,7],[0,9,8,13])
Cas de test 5
([5,8,7,11],[1,6,12,2],[9,0,13,10],[14,3,4,15])
Réponses:
PyPy, 195 mouvements, ~ 12 secondes de calcul
Calcule des solutions optimales en utilisant IDA * avec une heuristique de «distance de marche» augmentée de conflits linéaires. Voici les solutions optimales:
Et le code:
la source
JavaScript (ES6) total des étapes 329 pour les 5 cas de test en ~ 1 min
Modifier Même stratégie, cibles différentes, meilleure solution. Ralentissez ...
C'est plus ou moins comment je le résous à la main: utiliser des cibles intermédiaires Après chaque cible, les tuiles relatives ne sont plus déplacées Chaque cible intermédiaire est atteinte à l'aide d'une fonction BSF paramétrique. Les 2 paramètres sont la condition de boucle L (répéter si vrai) et la condition de sélection S (sélectionner quelle tuile peut être déplacée). Les marches:
Note latérale Je ne vérifie pas la position des tuiles 14 et 15. Les énigmes insolubles comme
[11,4,12,2,,15,10,3,5,,14,1,6,7,,0,9,8,13]
auront 14 et 15 échangées.Extrait ouvert pour tester ou jouer (Firefox uniquement)
Afficher l'extrait de code
Suite de tests dans la console Firefox / FireBug
Sortie
la source
J'ai commencé à travailler sur ce problème et je voulais contribuer avec mon code jusqu'à présent. Comme indiqué par Gareth, le problème est comparable au casse-tête à 8 carreaux et le code est donc basé sur la magnifique solution de Keith Randall et donc en Python. Cette solution peut résoudre les 5 cas de test avec une somme totale de moins de 400 mouvements, ainsi que d'autres puzzles. Il contient une solution optimisée et une force brute. Le code est un peu gonflé maintenant. La sortie est abrégée comme "llururd .." J'espère que c'est utile. http://www.penschuck.org/joomla/tmp/15Tile.txt (explication) http://www.penschuck.org/joomla/tmp/tile15.txt (code python)
la source