#P1558. Board Silly
Board Silly
问题描述
您是一个棋盘游戏开发团队的成员,负责编写棋盘分析模块,用于枚举给定玩家的所有合法移动。该游戏在一个的方格棋盘上进行(类似国际象棋或跳棋棋盘,但所有格子颜色相同)。棋盘的行用字母A-H表示(从上到下),列用数字1-8表示(从左到右)。
移动规则
- 移动方向:棋子可沿直线移动(上下左右或对角线方向)
- 移动步数:由移动方向所在行/列/对角线的棋子总数决定,必须严格等于该数量(不可多不可少)
- 跨越规则:
- 允许跳过己方棋子(规则3)
- 禁止跳过对手棋子(规则4)
- 吃子规则:通过移动到对手棋子所在位置实现吃子(规则5)
- 落子限制:不可移动到己方已有棋子的位置(规则6)
输入格式
- 多组棋盘布局,每组包含:
- 行列的字符矩阵('X'和'O'表示双方棋子,'.'表示空格)
- 一个字符'X'或'O'表示当前需要计算移动的玩家
- 输入以文件结束符终止
输出格式
- 对每个棋盘:
- 按字典序输出所有合法移动(格式:起始位置-目标位置,如"A1-B3")
- 若无合法移动则输出"No moves are possible"
- 不同棋盘的输出用空行分隔
示例说明
输入示例1:
O.......
O......X
O.....XX
O....XXX
.O...XXX
........
..O..XXX
........
O
对应输出:
A1-A2
A1-C3
...
G3-H4
输入示例2:
..OXO...
..OOO...
........
........
........
........
........
........
X
对应输出:
No moves are possible
关键算法
-
移动步数计算:对于棋子,在移动方向上:
- 统计该方向所在行/列/对角线的棋子总数
- 合法移动距离必须恰好为
-
路径验证:
- 检查目标位置是否为空或对手棋子
- 验证移动路径上是否仅包含己方棋子(允许跨越)或存在对手棋子(禁止跨越)
-
字典序排序:按棋盘坐标(A1 < A2 < ... < H8)排序输出结果
实现要求
程序需正确处理以下边界情况:
- 棋盘边缘的移动
- 不同方向的同名棋子数计算
- 吃子与普通移动的区分
- 空棋盘的判断