#1329. [CZOJ 一周一测 R20 D] 国际象棋
[CZOJ 一周一测 R20 D] 国际象棋
给定一张国际象棋棋盘,如图所示(如果考场不能上网导致无法查看棋盘的话,下发文件中也提供了图片。)
在国际象棋中,我们有 颗棋子,分别有 颗黑棋和 颗白棋。对于每种颜色的棋子,分别有 个兵(使用 M
表示), 个城堡(使用 C
表示), 个骑士(使用 H
表示), 个主教(使用 B
表示),一个后(使用 Q
表示)和一个王(使用 K
表示)。对于黑色,我们称为 B
表示;对于白色,我们使用 W
表示。对于一颗棋子,我们使用一个字符串 表示,其中 表示字符串拼接操作, 为棋子的种类, 为棋子的颜色。
我们将国际象棋的每个格子使用有序对 表示,其中 为大写字母 A
至 H
, 为 的整数,表示上述棋盘的一个格子。
对于每种棋子有如下的走法:
- 兵:直线行走,每步只能走一格,不能后退。可以吃斜前方的棋子,但是不能吃正前面的棋子。不可以跨越棋子!
- 城堡:直线行走,可以走任意多步,不可以跨过棋子
- 骑士:先向一个方向走两格,旋转 再走一步。可以跨过棋子。
- 主教:只可斜走,可以走任何多步,但是不可以跨越棋子。
- 后:可以向任何方向行走任意步,但是不可以转弯,不可以跨过棋子。
- 王:可以向任何方向行走一步。
注意,本题中棋子的走法可能与现实不同。
我们给出初始棋盘的样式,并给出你 步操作,每一步给定两个格子 ,表示你需要从将格子 上的棋子移动到格子 ,你需要报告操作是否合法,若合法则执行操作,否则跳过操作。所有操作结束后,你还需要输出棋盘上的布局。
一个操作合法,当且仅当 ,并且 上存在棋子且 上的棋子可以移到 ,并且 不可以存在自己的棋子(如果存在对方的棋子,则吃子)。
注意,本题中初始棋局为图示棋局,但是给出的棋局并不是初始棋局。
输入格式
第一行输出一个正整数 。
接下来 行,每行 个字符串,中间使用空格隔开,保证是棋子或 .
的一种。其中 .
表示这个位置没有任何棋子。
接下来 行,每行的格式如 (x,y) (a,b)
表示操作为将 上的棋子移至 。
输出格式
首先输出 行字符串,第 行的字符串表示第 个操作是否合法。具体地,如果第 个操作合法,请输出 Done.
,否则请输出 Opps, it doesn't works.
。
最后请输出一个 的字符串矩阵,表示最后的棋盘。具体地,你需要将棋盘从上到下,从左到右输出,同行的格子之间的数据使用空格隔开。
样例
# 样例输入 1
1
. . . . . . . .
. . . . . . . .
. . . . . . . .
. . . . . BB . .
. . . . . . . .
. . . BW . . . .
. . . . . . . .
. . . . . . . .
(D,3) (F,6)
# 样例输出 1
Opps, it doesn't works.
. . . . . . . .
. . . . . . . .
. . . . . . . .
. . . . . BB . .
. . . . . . . .
. . . BW . . . .
. . . . . . . .
. . . . . . . .
样例输入 2
6
KB MW MB . . . . .
HW . QB . . QW . BB
. CB BW KW MW . BB HB
MB . . MW HB . CB .
CW MB MB . MB MB . .
MB . . . CW MW HW .
MB . BW MW . . . MW
. . . . . . . .
(E,6) (E,7)
(E,5) (C,6)
(A,2) (A,1)
(F,3) (E,4)
(C,6) (A,7)
(B,6) (D,6)
样例输出 2
Done.
Done.
Done.
Done.
Done.
Done.
KB MW MB . . . . .
HB . QB . MW QW . BB
. . . CB . . BB HB
MB . . MW . . CB .
CW MB MB . MW MB . .
MB . . . CW . HW .
. . BW MW . . . MW
MB . . . . . . .
由于此题样例较多,不再提供大样例。
数据范围
对于 的数据,保证 。
对于 的数据,保证 。
对于 的数据,保证 。
保证所有格子是合法的,棋盘的棋子个数是合法的,棋盘上的棋子是合法的。