#P1558. Board Silly

    ID: 559 传统题 1000ms 256MiB 尝试: 1 已通过: 1 难度: 4 上传者: 标签>模拟搜索难度普及/提高-Mid-Central USA 1996

Board Silly

问题描述

您是一个棋盘游戏开发团队的成员,负责编写棋盘分析模块,用于枚举给定玩家的所有合法移动。该游戏在一个8×88×8的方格棋盘上进行(类似国际象棋或跳棋棋盘,但所有格子颜色相同)。棋盘的行用字母A-H表示(从上到下),列用数字1-8表示(从左到右)。

移动规则

  1. 移动方向:棋子可沿直线移动(上下左右或对角线方向)
  2. 移动步数:由移动方向所在行/列/对角线的棋子总数决定,必须严格等于该数量(不可多不可少)
  3. 跨越规则
    • 允许跳过己方棋子(规则3)
    • 禁止跳过对手棋子(规则4)
  4. 吃子规则:通过移动到对手棋子所在位置实现吃子(规则5)
  5. 落子限制:不可移动到己方已有棋子的位置(规则6)

输入格式

  • 多组棋盘布局,每组包含:
    • 8888列的字符矩阵('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

关键算法

  1. 移动步数计算:对于棋子(r,c)(r,c),在移动方向dd上:

    • 统计该方向所在行/列/对角线的棋子总数NN
    • 合法移动距离必须恰好为NN
  2. 路径验证

    • 检查目标位置是否为空或对手棋子
    • 验证移动路径上是否仅包含己方棋子(允许跨越)或存在对手棋子(禁止跨越)
  3. 字典序排序:按棋盘坐标(A1 < A2 < ... < H8)排序输出结果

实现要求

程序需正确处理以下边界情况:

  • 棋盘边缘的移动
  • 不同方向的同名棋子数计算
  • 吃子与普通移动的区分
  • 空棋盘的判断