Das verlorene Bauernproblem
Nach dem Ende der Schachpartie blieb ein überlebender Bauer hinter den feindlichen Linien zurück. Hilf ihm, den kürzesten Weg nach Hause zu finden.
Das ursprüngliche Problem beschreibt ein nXn-Schachbrett und eine Funktion f: {1,..,n-1}X{1,..,n}X{-1,0,1} => R+
der Gewichte. Das Ziel ist es, den besten Weg von einem Feld in der unteren Linie zu einem anderen Feld in der oberen Linie zu finden, wo die möglichen Bewegungen sind: links nach oben, oben, rechts nach oben, und Sie dürfen das Spielfeld nicht verlassen.
Das Problem ist in O (n ^ 2) mit dynamischer Programmierung relativ einfach zu lösen, aber das ist Codegolf, und es interessiert uns nicht, ob es sich um unnötige Dinge wie die Komplexität der Laufzeit handelt ...
Das Problem
Eingabe: Ein 3-dimensionales Array (oder eine andere Sammlung Ihrer Wahl, die über stdin oder als Funktionsargument empfangen wird), das einem regulären Schachbrett entspricht und genau die Größe 7X8X3 (#linePasses X #rowSize X #movesPerPass) enthält nicht negative ganze Zahlen. Die Verschiebungskosten von einer Position, (i,j)
an der i
sich der Zeilenindex und j
der Spaltenindex befinden, sind:
a[i][j][0]
für die Kosten zum Quadrat reisen links(i+1,j-1)
oder grafisch:\
.a[i][j][1]
für die Kosten zum Quadrat zu reisen(i+1,j)
, oder grafisch:|
.a[i][j][2]
für die Kosten zum Quadrat reisen oben rechts(i+1,j+1)
oder grafisch:/
.
Sie können davon ausgehen, dass es keinen Pfad enthält, der größer als ist MAX_INT
.
Ausgabe: Eine 8x8 ASCII-Ausgabe, die den besten Pfad (kürzeste, dh minimale Summe der Gewichte) anzeigt (wenn es mehr als ein optimales Ergebnis gibt, können Sie einen beliebigen Pfad Ihrer Wahl anzeigen). Der Pfad wird von unten nach oben gezeichnet, wobei in jeder Zeile das Zeichen, das der Position des Bauern im Pfad entspricht, dasjenige ist, das es machen soll. ZB wenn der Bauer von Spalte 3 nach links oben geht (zu Spalte 2), solltest du ziehen:
#?######
##\#####
wo ?
sollte mit dem nächsten Zug ersetzt werden. Endposition muss gezogen werden als X
.
Beispiele
Eingang:
[
[[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]]
]
Ausgabe:
##X#####
###\####
###|####
###|####
##/#####
#/######
#|######
##\#####
Eingang:
[
[[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]]
]
Ausgabe:
######X#
#####/##
####/###
#####\##
#####|##
######\#
######|#
#######\
Das ist Code-Golf , also gewinnt der kürzeste Code.
Fair spielen. keine Lücken ...
BEARBEITEN:
Ich habe eine unkomplizierte Lösung in Scala geschrieben, die Sie sich ansehen können. Es gibt auch eine Seite, auf der Sie online mit Scala-Code spielen können: Scalakata (kopieren Sie einfach den Inhalt von Scalakata und fügen Sie ihn ein. Klicken Sie dann auf die Wiedergabetaste.)