#P4001. Xiangqi

Xiangqi

题目描述

象棋是中国最受欢迎的两人棋盘游戏之一。游戏模拟了两军对战,目标是捕获对方的「将」或「帅」。在这个问题中,你将会看到一个游戏后期的局面,红方已经「将军」。你的任务是判断这个局面是否构成「将死」。

下面我们介绍一些象棋的基本规则:

  • 象棋在 10×910 \times 9 的棋盘上进行,棋子放在交叉点(坐标点)上。
  • 左上角的点是 (1,1)(1,1),右下角的点是 (10,9)(10,9)
  • 棋子分为黑方和红方,分别用不同的汉字标识。
  • 游戏过程中,双方轮流移动棋子,每次移动一个棋子到另一个点。
  • 同一时间不能有两个棋子占据同一个点。
  • 棋子可以移动到敌方棋子所在的位置,此时敌方棋子被「吃掉」并从棋盘上移除。
  • 当一方的「将」或「帅」在下一步可能被对方吃掉时,称为「将军」。
  • 如果「将」或「帅」的玩家无法通过任何移动避免被对方吃掉,则称为「将死」。

本题仅涉及以下44种棋子:

将/帅 (General)

  • 可以横向或纵向移动11格,不能离开「九宫」。
  • 特殊情况:「飞将」——如果双方的「将」或「帅」在同一条直线上,且中间没有其他棋子阻挡,则可以直线「飞将」吃掉对方。

车 (Chariot)

  • 可以横向或纵向任意距离移动和吃子,但不能跳过其他棋子。

炮 (Cannon)

  • 移动方式与车相同(横向或纵向任意距离),但吃子时必须「隔山打牛」——即中间必须恰好有一个棋子(无论敌友),然后才能吃掉目标棋子。

马 (Horse)

  • 可以走「日」字形(88个方向),但如果马的前进方向上有其他棋子(「蹩马腿」),则不能往该方向移动或吃子。

输入格式

输入包含不超过4040个测试用例。每个测试用例:

  • 第一行:33个整数 NN(红方棋子数,2N72 \leq N \leq 7)和黑方「将」的坐标 (x,y)(x, y)
  • 接下来的 NN 行:每行描述一个红方棋子,包括:
    • 棋子类型(G'G' 表示将/帅,R'R' 表示车,H'H' 表示马,C'C' 表示炮)。
    • 该棋子的坐标 (x,y)(x, y)
  • 保证局面合法,且红方已经「将军」。
  • 测试用例之间用空行分隔。
  • 输入以 0000 0 0 结束。

输出格式

对于每个测试用例:

  • 如果是「将死」,输出 YES'YES'
  • 否则,输出 NO'NO'

样例输入 1

2 1 4
G 10 5
R 6 4

3 1 5
H 4 5
G 10 5
C 7 5

0 0 0

样例输出 1

YES
NO

提示

在第一种情况中,黑将受到车和“飞将”的将军。在第二种情况中,黑将可以移动到1,4(1, 4)1,6(1, 6)来解除将军状态。见上图。

数据来源

福州20112011年程序设计竞赛