丢失的典当问题
象棋比赛结束后,幸存的棋子被留在了敌后。让我们帮助他找到回家的最短途路。
最初的问题描述了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 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#
#####/##
####/###
#####\##
#####|##
######\#
######|#
#######\
这是代码高尔夫球,因此最短的代码获胜。
公平竞赛。没有漏洞...
编辑:
我在scala中写了一个简单的解决方案,您可以看一下。还有一个可以在线使用Scala代码播放的站点:scalakata(只需将要点复制并粘贴到scalakata,然后点击“播放”按钮)