失われたポーンの問題
チェスゲームが終了した後、生き残ったポーンは敵のラインの後ろに残されました。彼が家に戻る最短の道を見つけるのを手伝いましょう。
元の問題は、nXn「チェス」ボードとf: {1,..,n-1}X{1,..,n}X{-1,0,1} => R+
重みの関数について説明しています。目標は、下の行のある正方形から上の行のある他の正方形への最適なパスを見つけることです。ここで、可能な動きは次のとおりです。左から上、右から上。
この問題は、動的プログラミングを使用してO(n ^ 2)で比較的簡単に解決できますが、これはcodegolfであり、実行時間の複雑さのような無駄なものは気にしません...
問題
入力:正確にサイズが通常のチェスボードに対応する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出力(最適な結果が複数ある場合は、任意のパスを表示できます)。パスは下から上に描画されます。各行では、パス内のポーンの位置に対応する文字が、作成しようとしている文字です。例えば、ポーンが列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#
#####/##
####/###
#####\##
#####|##
######\#
######|#
#######\
これはcode-golfなので、最短のコードが優先されます。
プレイフェア。抜け穴はありません...
編集:
Iv'eは、あなたが見ることができるscalaでゴルフをしていないまっすぐな解決策を書きました。オンラインでscalaコードでプレイできるサイトもあります:scalakata(要点をscalakataにコピーして貼り付け、再生ボタンを押すだけです)