Проблема потерянной пешки
После окончания игры в шахматы выжившая пешка осталась за линией врага. давайте поможем ему найти кратчайший путь домой.
Первоначальная задача описывает nXn «шахматную» доску и функцию f: {1,..,n-1}X{1,..,n}X{-1,0,1} => R+
весов. цель состоит в том, чтобы найти лучший путь от некоторого квадрата в нижней строке до другого квадрата в верхней строке, где возможны следующие движения: вверх-вверх, вверх-вправо, и вы не можете выйти с игрового поля.
Эту проблему относительно легко решить в O (n ^ 2) с помощью динамического программирования, но это Codegolf, и нас не волнуют бесполезные вещи, такие как сложность во время выполнения ...
Проблема
input: 3-мерный массив (или другой набор по вашему выбору, полученный через stdin или в качестве аргумента функции), соответствующий обычной шахматной доске, точно по размеру: 7X8X3 (#linePasses X #rowSize X #movesPerPass), содержащий неотрицательные целые числа. стоимость перемещения из некоторой позиции, (i,j)
где i
находится индекс строки и индекс j
столбца:
a[i][j][0]
за стоимость путешествовать вверх-влево на площадь(i+1,j-1)
, или графически:\
.a[i][j][1]
за затраты на проезд до площади(i+1,j)
, или графически:|
.a[i][j][2]
за стоимость путешествовать вверх прямо на площади(i+1,j+1)
, или графически:/
.
Вы можете предположить, что он не будет содержать путь, сумма которого больше, чем MAX_INT
.
вывод: вывод 8x8 ascii, показывающий лучший (самый короткий, т.е. минимальная сумма весов) путь (если имеется более 1 оптимального результата, вы можете показать произвольный путь по вашему выбору). путь рисуется снизу вверх, где в каждой строке символ, соответствующий положению пешки на пути, является тем, который он собирается сделать. Например, если пешка собирается переместиться вверх-влево от столбца 3 (к столбцу 2), вы должны нарисовать:
#?######
##\#####
где ?
следует заменить следующим ходом. Окончательная позиция должна быть нарисована как X
.
Примеры
вход:
[
[[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]]
]
выход:
##X#####
###\####
###|####
###|####
##/#####
#/######
#|######
##\#####
вход:
[
[[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]]
]
выход:
######X#
#####/##
####/###
#####\##
#####|##
######\#
######|#
#######\
это код-гольф , поэтому выигрывает самый короткий код.
играй честно. никаких лазеек ...
РЕДАКТИРОВАТЬ:
Iv'e написал решение для scala, которое вы можете посмотреть. Есть также сайт, на котором вы можете играть с помощью scala-кода в режиме онлайн: scalakata (просто скопируйте и вставьте его в scalakata и нажмите кнопку воспроизведения)