Le problème du pion perdu
Après la fin du jeu d'échecs, un pion survivant a été laissé derrière les lignes ennemies. aidons-le à trouver le chemin le plus court pour rentrer chez lui.
Le problème d'origine décrit un plateau d'échecs nXn et une fonction f: {1,..,n-1}X{1,..,n}X{-1,0,1} => R+
des poids. le but est de trouver le meilleur chemin entre un carré de la ligne de fond et un autre carré de la ligne supérieure, où les mouvements possibles sont: gauche-haut, haut, droite-haut, et vous ne pouvez pas quitter le plateau.
Le problème est relativement facile à résoudre dans O (n ^ 2) en utilisant la programmation dynamique, mais c'est du codegolf, et nous ne nous soucions pas de choses inutiles comme la complexité du temps d'exécution ...
Le problème
entrée: un tableau à 3 dimensions (ou une autre collection de votre choix, reçue via stdin, ou comme argument de fonction), correspondant à un échiquier régulier, exactement de la taille: 7X8X3 (#linePasses X #rowSize X #movesPerPass) contenant entiers non négatifs. les mouvements coûtent à partir d' une position (i,j)
où i
est l'index de ligne, et j
est l'index de colonne, sont:
a[i][j][0]
pour les frais de voyage jusqu'à gauche à la case départ(i+1,j-1)
ou graphique:\
.a[i][j][1]
pour les frais de voyage jusqu'à carré(i+1,j)
ou graphique:|
.a[i][j][2]
pour les frais de voyage en haut à droite à la case départ(i+1,j+1)
ou graphique:/
.
vous pouvez supposer qu'il ne contiendra pas de chemin supérieur à MAX_INT
.
sortie: une sortie ascii 8X8 montrant le meilleur chemin (le plus court, c'est-à-dire la somme minimale des poids) (s'il y a plus d'un résultat optimal, vous pouvez montrer un chemin arbitraire de votre choix). le chemin est tracé de bas en haut, où dans chaque ligne, le caractère correspondant à la position du pion dans le chemin, est celui qu'il s'apprête à faire. Par exemple, si le pion est sur le point de se déplacer vers le haut à gauche de la colonne 3 (vers la colonne 2), vous devez dessiner:
#?######
##\#####
où ?
devrait être remplacé par le prochain mouvement. la position finale doit être tracée comme X
.
Exemples
contribution:
[
[[1,1,1],[1,1,1],[0,1,1],[1,1,1],[1,1,1],[1,1,1],[1,1,1],[1,1,1]],
[[1,1,1],[1,0,1],[1,1,1],[1,1,1],[1,1,1],[1,1,1],[1,1,1],[1,1,1]],
[[1,1,1],[1,1,0],[1,1,1],[1,1,1],[1,1,1],[1,1,1],[1,1,1],[1,1,1]],
[[1,1,1],[1,1,1],[1,1,0],[1,1,1],[1,1,1],[1,1,1],[1,1,1],[1,1,1]],
[[1,1,1],[1,1,1],[1,1,1],[1,0,1],[1,1,1],[1,1,1],[1,1,1],[1,1,1]],
[[1,1,1],[1,1,1],[1,1,1],[1,0,1],[1,1,1],[1,1,1],[1,1,1],[1,1,1]],
[[1,1,1],[1,1,1],[1,1,1],[0,1,1],[1,1,1],[1,1,1],[1,1,1],[1,1,1]]
]
production:
##X#####
###\####
###|####
###|####
##/#####
#/######
#|######
##\#####
contribution:
[
[[41,27,38],[12,83,32],[50,53,35],[46,32,26],[55,89,82],[75,30,87],[2,11,64],[8,55,22]],
[[56,21,0],[83,25,38],[43,75,63],[56,60,77],[68,55,89],[99,48,67],[94,30,9],[62,62,58]],
[[23,18,40],[24,47,61],[96,45,72],[71,6,48],[75,63,98],[93,56,51],[23,31,30],[49,34,99]],
[[20,47,42],[62,79,72],[32,28,44],[68,61,55],[62,39,57],[4,17,49],[97,85,6],[91,18,12]],
[[51,50,11],[32,39,56],[12,82,23],[33,88,87],[60,55,22],[29,78,14],[70,11,42],[63,94,67]],
[[75,64,60],[27,79,86],[70,72,56],[55,45,32],[95,67,12],[87,93,98],[81,36,53],[38,22,93]],
[[31,80,50],[77,71,22],[59,46,86],[64,71,53],[41,19,95],[62,71,22],[92,80,41],[26,74,29]]
]
production:
######X#
#####/##
####/###
#####\##
#####|##
######\#
######|#
#######\
c'est le code-golf , donc le code le plus court l'emporte.
jouer franc jeu. pas d'échappatoires ...
ÉDITER:
Iv'e a écrit une solution simple sans golf en scala que vous pouvez regarder. Il y a aussi un site que vous pouvez jouer avec du code scala en ligne: scalakata (copiez et collez simplement l'essentiel sur scalakata et appuyez sur le bouton de lecture)