ブラックポーンの復讐


8

目的

黒のポーンは復讐を望んでいます。最後の攻撃をプロットします。

ルール

黒いポーン(L)は一番上の行から始まり、一番下の行に移動します。取得したポイントを最大化し、でパスを示しますX。ポーン(P)は1、ビショップ(B)とナイト(N)3、ルーク(R)5、クイーン(Q)9です。入力にはキングはありません。

ポイントの数が最大のパスが複数ある場合は、それらのパスのいずれかを出力します。ポーンが最下列に到達できない状況はありません。

入力:

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

出力:

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

入力:

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

出力:

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

ポーンが一番下の行に到達できない場合はどうなりますか?
Reto Koradi 2015年

実際には、テキストはそれ一番下の行に到達する必要あること決して言いません。それが意図ですか?2番目の例で、ポーンがクイーンを捕獲した後、パスが5行目で停止することは有効でしょうか?
Reto Koradi 2015年

@RetoKoradiふh。私は実際にはそのことを考えていません。ええ、ポーンは一番下の列に到達するはずです。ポーンが一番下の行に到達できない場合は、入力では発生しないと想定できます。
アブサン

1
そして、それが最下位の行に到達すると、それは女王として昇進され、eleseを皆殺しにします...
コアダンプ

El Passantはどうですか?

回答:


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)

2

ルビー260258255 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]}

このプログラムは関数(s)を定義します。この関数は、いくつかのボード行を指定すると、最適なパスを文字列として返し、値をそのパスのポイントで返します。sは再帰的であるため、各ステップですべての可能性を評価し、最良のものを返します。

テスト付きのオンラインバージョンは次のとおりです。http//ideone.com/6eMtm4

読み取り可能なバージョンは、こちらから入手できます:http : //ideone.com/eoXUtp

コードのサイズを小さくするために行ったすべての手順は、ここにあります

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.