A vingança do peão preto

8

Objetivo

O peão preto quer vingança. Planeje seu último ataque.

Regras

O peão preto ( L) começa na linha superior e desce para a linha inferior. Maximize os pontos obtidos, indicando o caminho com X. Peões ( P) são 1, bispos ( B) e cavaleiros ( N) 3, torres ( R) 5 e rainhas ( Q) 9. Não haverá reis na entrada.

Se houver mais de um caminho com a quantidade máxima de pontos, imprima qualquer um desses caminhos. Não haverá situações em que o peão não possa alcançar a linha inferior.

Exemplos

Entrada:

----L---
-----P--
------P-
--R--P-Q
----P-P-
---P-P-P
--P-N---
-P------

Resultado:

----L---
-----X--
------X-
--R--P-X
----P-X-
---P-X-P
--P-X---
-P--X---

Entrada:

--L-----
-P------
P-------
-P------
P--Q----
-P------
P-------
-P------

Resultado:

--L-----
-PX-----
P-X-----
-PX-----
P--X----
-P-X----
P--X----
-P-X----
absinto
fonte
O que deve acontecer se o peão não puder alcançar a linha inferior?
Reto Koradi
Na verdade, o texto nunca diz que precisa atingir a linha inferior. Essa é a intenção? Digamos, no segundo exemplo, seria válido que o caminho parasse na 5ª linha depois que o peão capturasse a rainha?
Reto Koradi
@RetoKoradi Huh. Na verdade, eu não pensei nisso. Sim, o peão deve chegar à linha de baixo. Você pode supor que os casos em que o peão não possa alcançar a linha inferior não ocorrerão na entrada.
absinthe
1
E quando se atinge a linha bottow, é promovido como uma rainha e matar todos elese ...
coredump
E o El Passant?

Respostas:

2

Python, 332

def s(m,l,p):
 if not m:return 1
 b=m[0]+'-';z=filter(lambda i:(b[i]=='-')==(i==l),[l,l-1,l+1])
 if not z:return 0
 g=lambda i:s(m[1:],i,0)+[0,1,3,3,5,9]['-PBNRQ'.index(b[i])];i=max(z,key=g)
 if p:print m[0][:i]+'X'+m[0][i+1:];s(m[1:],i,p)
 return g(i)
import sys
t=sys.stdin.read().split('\n')
print t[0]
s(t[1:],t[0].index('L'),1)
caixa de papelão
fonte
2

Ruby 260 258 255 241 236 222

->b{s=->l,w=p{c,*x=l.map &:dup
v=[1,3,3,5,9,0]['PBNRQ'.index(c[y=w||c.index(?L)])||5]
w&&c[y]=?X
(n=x[0])?(m=[]
[y-1,y,y+1].map{|z|(z==y)^(n[z]>?.)&&m<<s[x,z]}
q,r=m.max_by{|m|m ?m[0]:0}
q&&[q+v,c+r]):[v,c]}
s[b.lines][1]}

Este programa define uma função ( s) que, dada algumas linhas da placa, retorna o melhor caminho como uma string e o valor em pontos desse caminho. sé recursivo, portanto, a cada passo, ele avalia todas as possibilidades e retorna a melhor.

Aqui está uma versão online com testes: http://ideone.com/6eMtm4

A versão legível está disponível aqui: http://ideone.com/eoXUtp

Todas as etapas que tomei para reduzir o tamanho do código podem ser encontradas aqui .

Cristian Lupascu
fonte