#P11975. [KTSC 2021] 翻牌游戏 / card
[KTSC 2021] 翻牌游戏 / card
题目背景
本题翻译自 2021년도 국제정보올림피아드 대표학생 선발고사 1차 선발고사 #1 카드 뒤집기 게임。
题目描述
翻牌游戏是一种单人卡牌游戏,使用两种类型的卡牌 A 和 B。卡牌 A 上写有游戏规则的相关信息。具体来说,如图 1 所示,卡牌 A 上写有两个整数 和 (),以及一个大小为 的由字符 O
和 X
组成的图案 。
卡牌 B 的正面写有字符 O
,背面写有字符 X
。每张卡牌 B 代表卡牌 A 上的图案中的一个字符,为此准备了足够多的卡牌 B。
游戏开始时,首先选择一张卡牌 A,并根据其上的 值将卡牌 B 排列成 的网格。初始时所有卡牌都显示 X
。每个卡牌的位置用行号和列号标记,如图 2 所示。
初始排列完成后,玩家可以重复进行如下翻牌操作。每次翻牌由两个步骤组成:
- 步骤 1:在 网格中选择任意一行或一列,并根据卡牌 A 上的整数 选择一个任意的整数 ()。
- 步骤 2:
- 如果选择的是行 ,则对于所有满足 的列 ,翻转位置 上的卡牌。
- 如果选择的是列 ,则对于所有满足 的行 ,翻转位置 上的卡牌。
玩家的目标是通过重复翻牌操作,使网格中的卡牌图案与卡牌 A 上的图案 完全一致。请判断这是否可能实现。
实现细节
你需要实现以下函数:
bool reversal(int N, int M, vector<string> P)
- 该函数仅被调用一次。
- 参数 表示网格的大小。
- 参数 表示翻牌操作中卡牌的间隔。
- 参数 是一个包含 个字符串的数组,每个字符串长度为 , 表示目标图案的第 行。
- 如果通过翻牌操作可以从初始排列得到图案 ,则返回
true
,否则返回false
。
输入格式
示例评测程序的输入格式如下:
- 第 行:
- 第 行到第 行:
注意:示例评测程序可能与实际评测程序不同。
输出格式
示例评测程序的输出格式如下:
- 第 行:一个字符
0
或1
,分别表示false
或者true
5 2
XXXOX
XXXOX
OOOXO
XOXXX
XOXXX
1
提示
约束条件
- 中的所有字符为
O
或X
。
子任务
- ( 分)
- ( 分)
- ( 分)
- 无额外约束。
评分标准
每个子任务的得分是该子任务所有测试点得分的最小值。
示例
-
, ,图案 $P = [\texttt{XXXXX}, \texttt{XXXXX}, \texttt{OOOXO}, \texttt{XOXXX}, \texttt{XOXXX}]$ 时,评测程序将调用:
reversal(5, 2, ["XXXXX", "XXXXX", "OOOXO", "XOXXX", "XOXXX"])
下图展示了从初始状态开始,通过翻牌操作,根据选择的行或列号和 值,卡牌图案的变化过程。最终形成了图案 。因此,调用的
reversal
函数应返回true
。