O problema do peão perdido
Depois que o jogo terminou, um peão sobrevivente foi deixado para trás das linhas inimigas. vamos ajudá-lo a encontrar o caminho mais curto para voltar para casa.
O problema original descreve um tabuleiro de xadrez nXn e uma função f: {1,..,n-1}X{1,..,n}X{-1,0,1} => R+
de pesos. o objetivo é encontrar o melhor caminho de algum quadrado na linha inferior, para outro quadrado na linha superior, onde os movimentos possíveis são: esquerda para cima, para cima, para a direita e você não pode sair do tabuleiro.
O problema é relativamente fácil de resolver em O (n ^ 2) usando programação dinâmica, mas isso é codegolf, e não nos importamos com coisas inúteis, como complexidade do tempo de execução ...
O problema
input: uma matriz tridimensional (ou alguma outra coleção de sua escolha, recebida através de stdin ou como argumento de função), correspondente a um tabuleiro de xadrez regular, exatamente no tamanho: 7X8X3 (#linePasses X #rowSize X #movesPerPass) contendo números inteiros não negativos. os movimentos custam de alguma posição em (i,j)
que i
está o índice de linha e j
o índice de coluna são:
a[i][j][0]
para o custo de viajar up-esquerda para a praça(i+1,j-1)
, ou graficamente:\
.a[i][j][1]
para o custo de viajar até ao quadrado(i+1,j)
, ou graficamente:|
.a[i][j][2]
para o custo de viajar até direito ao quadrado(i+1,j+1)
, ou graficamente:/
.
você pode presumir que não conterá um caminho que tenha somas maiores que MAX_INT
.
saída: uma saída 8X8 ascii mostrando o melhor caminho (menor, ou seja, a soma mínima de pesos) (se houver mais de um resultado ideal, você poderá mostrar um caminho arbitrário de sua escolha). o caminho é desenhado de baixo para cima, onde em cada linha, o caractere correspondente à posição do peão no caminho, é o que ele está prestes a criar. por exemplo, se o peão estiver prestes a se mover para cima-esquerda da coluna 3 (para a coluna 2), você deve desenhar:
#?######
##\#####
onde ?
deve ser substituído pelo próximo passo. posição final precisa ser desenhada como X
.
Exemplos
entrada:
[
[[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]]
]
resultado:
##X#####
###\####
###|####
###|####
##/#####
#/######
#|######
##\#####
entrada:
[
[[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]]
]
resultado:
######X#
#####/##
####/###
#####\##
#####|##
######\#
######|#
#######\
isso é código-golfe , então o código mais curto vence.
jogue Limpo. sem brechas ...
EDITAR:
Iv'e escreveu uma solução direta e não-golfe em scala que você pode olhar. Há também um site que você pode jogar com o código scala on-line: scalakata (basta copiar e colar a essência do scalakata e pressionar o botão play)