#P4001. Xiangqi
Xiangqi
题目描述
象棋是中国最受欢迎的两人棋盘游戏之一。游戏模拟了两军对战,目标是捕获对方的「将」或「帅」。在这个问题中,你将会看到一个游戏后期的局面,红方已经「将军」。你的任务是判断这个局面是否构成「将死」。
下面我们介绍一些象棋的基本规则:
- 象棋在 的棋盘上进行,棋子放在交叉点(坐标点)上。
- 左上角的点是 ,右下角的点是 。
- 棋子分为黑方和红方,分别用不同的汉字标识。
- 游戏过程中,双方轮流移动棋子,每次移动一个棋子到另一个点。
- 同一时间不能有两个棋子占据同一个点。
- 棋子可以移动到敌方棋子所在的位置,此时敌方棋子被「吃掉」并从棋盘上移除。
- 当一方的「将」或「帅」在下一步可能被对方吃掉时,称为「将军」。
- 如果「将」或「帅」的玩家无法通过任何移动避免被对方吃掉,则称为「将死」。
本题仅涉及以下种棋子:
将/帅 (General):
- 可以横向或纵向移动格,不能离开「九宫」。
- 特殊情况:「飞将」——如果双方的「将」或「帅」在同一条直线上,且中间没有其他棋子阻挡,则可以直线「飞将」吃掉对方。
车 (Chariot):
- 可以横向或纵向任意距离移动和吃子,但不能跳过其他棋子。
炮 (Cannon):
- 移动方式与车相同(横向或纵向任意距离),但吃子时必须「隔山打牛」——即中间必须恰好有一个棋子(无论敌友),然后才能吃掉目标棋子。
马 (Horse):
- 可以走「日」字形(个方向),但如果马的前进方向上有其他棋子(「蹩马腿」),则不能往该方向移动或吃子。
输入格式
输入包含不超过个测试用例。每个测试用例:
- 第一行:个整数 (红方棋子数,)和黑方「将」的坐标 。
- 接下来的 行:每行描述一个红方棋子,包括:
- 棋子类型( 表示将/帅, 表示车, 表示马, 表示炮)。
- 该棋子的坐标 。
- 保证局面合法,且红方已经「将军」。
- 测试用例之间用空行分隔。
- 输入以 结束。
输出格式
对于每个测试用例:
- 如果是「将死」,输出 。
- 否则,输出 。
样例输入 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
提示
在第一种情况中,黑将受到车和“飞将”的将军。在第二种情况中,黑将可以移动到或来解除将军状态。见上图。
数据来源
福州年程序设计竞赛