#L4280. 「KTSC 2021 R1」翻牌游戏

「KTSC 2021 R1」翻牌游戏

42804280. 「KTSC 20212021 R1」翻牌游戏

传统 10001000 ms 10241024 MiB 20212021 KTSC 33 通过 88 提交

注意事项

在 LibreOJ 上,由于语言限制,目前只支持以下语言的提交:

C++(标准为 C++ 1717 及以上) 请在提交源代码前添加 #include "card.h"

题目描述

题目译自 20212021년도 국제정보올림피아드 대표학생 선발고사 - 11차 선발고사 T11 「카드 뒤집기 게임」

翻牌游戏是一种单人卡牌游戏,使用两种类型的卡牌 AABB。卡牌 AA 上写有游戏规则的信息,具体来说,如图 11 所示,包含两个整数 NNMM (MNM \leq N),以及一个 N×NN \times N 的由字符 O\texttt{O}X\texttt{X} 组成的图案 PP

11

卡牌 BB 的正面是字符 O\texttt{O},背面是字符 X\texttt{X}。卡牌 BB 用来表示卡牌 AA 上图案中的每个字符,为此准备了足够多的卡牌 BB

游戏开始时,选择一张卡牌 AA,并根据卡牌上的 NN 值,将卡牌 BBN×NN \times N 的格子排列。初始时,所有卡牌 BB 都显示 X\texttt{X}。每张卡牌的位置如图 22 所示,用行号和列号区分。

22

初始排列完成后,玩家可以根据需要重复进行翻牌操作。一次翻牌操作分为两个步骤:

步骤 11:在 N×NN \times N 的格子中选择任意一行或一列,并根据卡牌 AA 上的整数 MM 选择一个整数 kk (0k<M0 \leq k < M)。

步骤 22:如果选择的是第 ii 行,则对所有满足 jk(modM)j \equiv k \pmod{M} 的列 jj 进行翻牌操作,即翻转 (i,j)(i, j) 位置上的所有卡牌。同样地,如果选择的是第 jj 列,则对所有满足 ik(modM)i \equiv k \pmod{M} 的行 ii 进行翻牌操作,即翻转 (i,j)(i, j) 位置上的所有卡牌。

玩家需要通过重复翻牌操作,使格子中的卡牌图案与卡牌 AA 上的图案 PP 一致。我们来判断一下,这是否真的可行。

实现细节

你需要实现以下函数:

bool reversal(int N, int M, vector<string> P);
  • 该函数只会被调用一次。
  • 参数 NN 表示格子的大小。
  • 参数 MM 表示翻牌操作中翻转卡牌的间隔。
  • 参数 PP 是一个包含 NN 个字符串的数组,每个字符串长度为 NN,表示需要形成的图案的第 ii 行。
  • 该函数返回一个布尔值,如果可以通过翻牌操作从初始排列形成图案 PP,则返回 true,否则返回 false

注意:提交的代码中不应包含任何输入输出操作。

样例

考虑 N=5N=5, M=2M=2,图案 $P=[\texttt{XXXOX}, \texttt{XXXOX}, \texttt{OOOXO}, \texttt{XOXXX}, \texttt{XOXXX}]$ 的情况。评测程序将调用如下函数:

reversal(5, 2, ["XXXOX", "XXXOX", "OOOXO", "XOXXX", "XOXXX"]);

下图展示了从初始状态开始,通过翻牌操作,根据选择的行/列号和 kk 值,卡牌图案的变化过程。最终形成了图案 PP。因此,调用的 reversal 函数应返回 true

数据范围与提示

对于所有输入数据,满足:

  • 1MN10001 \leq M \leq N \leq 1000
  • PP 中的所有字符都是 O\texttt{O}X\texttt{X}

详细子任务附加限制及分值如下表所示。

子任务 分值 附加限制
11 1111 N×M10N \times M \leq 10
22 5050 M=1M=1
33 3939 无附加限制

示例评测程序

示例评测程序的输入格式如下:

  • 11 行:NN MM
  • 2+i2+i 行:P[i]P[i]

示例评测程序可能与实际评测程序不同。