Sự trả thù của cầm đồ đen


8

Mục tiêu

Con tốt đen muốn trả thù. Vẽ ra cuộc tấn công cuối cùng của nó.

Quy tắc

Con tốt màu đen ( L) bắt đầu ở hàng trên cùng và di chuyển xuống hàng dưới cùng. Tối đa hóa điểm thực hiện, chỉ ra đường dẫn với X. Chân ( P) là 1, giám mục ( B) và hiệp sĩ ( N) 3, rooks ( R) 5 và nữ hoàng ( Q) 9. Sẽ không có bất kỳ vị vua nào trong đầu vào.

Nếu có nhiều hơn một đường dẫn có số điểm tối đa, hãy xuất bất kỳ đường dẫn nào. Sẽ không có bất kỳ tình huống mà cầm đồ không thể đạt đến hàng dưới cùng.

Ví dụ

Đầu vào:

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

Đầu ra:

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

Đầu vào:

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

Đầu ra:

--L-----
-PX-----
P-X-----
-PX-----
P--X----
-P-X----
P--X----
-P-X----

Điều gì sẽ xảy ra nếu con tốt không thể đến hàng dưới cùng?
Reto Koradi

Trên thực tế, các văn bản chưa bao giờ nói rằng nó để đạt hàng dưới cùng. Đó có phải là ý định? Nói, trong ví dụ thứ hai, nó có hợp lệ cho con đường dừng lại ở hàng thứ 5, sau khi con tốt bắt được nữ hoàng không?
Reto Koradi

@RetoKoradi Huh. Tôi thực sự không nghĩ về điều đó. Vâng, cầm đồ sẽ đạt đến hàng dưới cùng. Bạn có thể cho rằng bất kỳ trường hợp nào cầm đồ không thể đến hàng dưới cùng sẽ không xảy ra trong đầu vào.
absinthe

1
Và khi nó chạm đến hàng đáy, nó được thăng cấp như một nữ hoàng và giết chết tất cả mọi người ...
coredump

Còn El Passant thì sao?

Câu trả lời:


2

Con trăn

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)

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]}

Chương trình này định nghĩa một hàm ( s), được đưa ra một số hàng bảng, trả về đường dẫn tốt nhất dưới dạng một chuỗi và giá trị trong các điểm của đường dẫn đó. slà đệ quy, vì vậy ở mỗi bước, nó đánh giá tất cả các khả năng và trả về cái tốt nhất.

Đây là phiên bản trực tuyến có các bài kiểm tra: http://ideone.com/6eMtm4

Phiên bản dễ đọc có sẵn tại đây: http://ideone.com/eoXUtp

Tất cả các bước tôi đã thực hiện để giảm kích thước của mã có thể được tìm thấy ở đây .

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.