Pembalasan Pion Hitam

8

Objektif

Gadai hitam ingin membalas dendam. Plotkan serangan terakhirnya.

Aturan

Gadai hitam ( L) dimulai dari baris atas dan bergerak ke bawah ke baris bawah. Maksimalkan poin yang diambil, yang menunjukkan jalur dengan X. Bidak ( P) adalah 1, uskup ( B) dan ksatria ( N) 3, benteng ( R) 5, dan ratu ( Q) 9. Tidak akan ada raja di input.

Jika ada lebih dari satu jalur yang memiliki jumlah titik maksimum, hasilkan jalur tersebut. Tidak akan ada situasi di mana pion tidak dapat mencapai baris bawah.

Contohnya

Memasukkan:

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

Keluaran:

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

Memasukkan:

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

Keluaran:

--L-----
-PX-----
P-X-----
-PX-----
P--X----
-P-X----
P--X----
-P-X----
Absinth
sumber
Apa yang harus terjadi jika pion tidak dapat mencapai baris paling bawah?
Reto Koradi
Sebenarnya, teks itu tidak pernah mengatakan bahwa ia harus mencapai baris paling bawah. Apakah itu niatnya? Katakanlah, dalam contoh kedua, apakah itu sah untuk jalan berhenti di baris ke-5, setelah pion menangkap ratu?
Reto Koradi
@RetoKoradi Huh. Saya belum benar-benar memikirkan itu. Ya, pion itu harus mencapai baris paling bawah. Anda dapat mengasumsikan bahwa setiap kasus di mana pion tidak dapat mencapai baris bawah tidak akan terjadi pada input.
absinth
1
Dan ketika mencapai barisan bottow, dipromosikan sebagai ratu dan membunuh semua orang ...
coredump
Bagaimana dengan El Passant?

Jawaban:

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)
kotak kardus
sumber
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]}

Program ini mendefinisikan fungsi ( s), yang, diberikan beberapa baris papan, mengembalikan jalur terbaik sebagai string, dan nilai dalam titik-titik jalur itu. sbersifat rekursif, jadi pada setiap langkah itu mengevaluasi semua kemungkinan dan mengembalikan yang terbaik.

Berikut ini adalah versi online dengan tes: http://ideone.com/6eMtm4

Versi yang dapat dibaca tersedia di sini: http://ideone.com/eoXUtp

Semua langkah yang saya ambil untuk mengurangi ukuran kode dapat ditemukan di sini .

Cristian Lupascu
sumber