Проблема втраченої пішаки
Після закінчення гри в шахи вижив пішак залишився позаду ворожих ліній. давайте допоможемо йому знайти найкоротший шлях додому.
Початкова проблема описує «шахову» дошку nXn та функцію f: {1,..,n-1}X{1,..,n}X{-1,0,1} => R+
ваг. мета полягає в тому, щоб знайти найкращий шлях від якогось квадрата на лінії внизу, до якогось іншого квадрата у верхній лінії, де можливі рухи: ліворуч вгору, вгору, вправо, і ви не можете виходити з дошки.
Проблему порівняно легко вирішити в O (n ^ 2) за допомогою динамічного програмування, але це кодегольф, і нам не байдуже такі непотрібні речі, як складність часу роботи ...
Проблема
вхід: 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 ассі вивід, що показує найкращий (найкоротший, тобто мінімальна сума ваги) шлях (якщо оптимального результату більше 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#
#####/##
####/###
#####\##
#####|##
######\#
######|#
#######\
це код-гольф , тому найкоротший код виграє.
грати справедливо. немає лазівки ...
Редагувати:
Я написав рішення, що не входить в гольф, прямо в масштабі, який ви можете подивитися. Існує також веб-сайт, на якому можна грати в режимі он-лайн з кодом scala: scalakata (просто скопіюйте та вставте суть у scalakata та натисніть кнопку відтворення)