QOJ.ac

QOJ

Límite de tiempo: 1 s Límite de memoria: 1024 MB Puntuación total: 100

#4084. 翻牌游戏

Estadísticas

카드 뒤집기 게임은 혼자서 하는 카드 게임으로, 두 가지 타입의 카드 A, B를 사용한다. 카드 A에는 게임에 적용될 규칙에 관한 정보가 적혀 있다. 구체적으로, 그림 1과 같이 두 정수 $N$과 $M(\le N)$, 그리고 $N \times N$ 격자 형태로 문자 ‘O’와 ‘X’가 배치된 패턴 $P$가 적혀 있다.

그림 1

카드 B는 앞면에 문자 ‘O’, 뒷면에 문자 ‘X’가 적힌 카드다. 카드 B 한 장은 카드 A에 적힌 패턴의 문자 하나를 나타내기 위해 사용될 것인데, 이를 위해 충분히 많은 양의 카드 B가 준비되어 있다.

게임을 시작해보자. 먼저, 카드 A를 하나 선택하고, 그 카드에 적힌 $N$ 값에 따라 $N \times N$ 격자 형태로 카드 B를 배치한다. 처음 배치되는 카드는 모두 ‘X’가 보이도록 배치해야 한다. 배치된 각 카드는 그림 2처럼 행과 열의 번호로 구분한다.

그림 2

카드의 초기 배치가 끝나면, 플레이어는 아래에 설명하는 ‘뒤집기’를 필요에 따라 반복한다. 한 번의 ‘뒤집기’는 두 단계로 구성된다.

  • 단계 1: 카드가 놓인 $N \times N$ 격자에서 임의의 한 행 또는 한 열을 선택한다. 또한, 카드 A에 적힌 정수 $M$에 따라 임의의 정수 $k(0 \le k < M)$를 선택한다.
  • 단계 2: 단계 1에서 선택한 것이 행 $i$라면, $j \equiv k \pmod M$인 모든 $j$에 대해, 격자 상에서 $(i, j)$ 위치에 있는 모든 카드를 뒤집는다. 유사하게, 단계 1에서 선택한 것이 열 $j$라면, $i \equiv k \pmod M$인 모든 $i$에 대해, 격자 상에서 $(i, j)$ 위치에 있는 모든 카드를 뒤집는다.

플레이어는 ‘뒤집기’를 반복해서 격자에 놓인 카드의 패턴과 카드 A에 그려진 패턴 $P$를 일치시켜야 한다. 이것이 실제로 가능한 일인지 판별해보자.

구현 세부 사항

여러분은 아래 함수를 구현해야 한다.

bool reversal(int N, int M, vector<string> P)
  • 이 함수는 단 한 번만 호출된다.
  • 인자로 주어지는 정수 $N$은 격자의 크기를 나타낸다.
  • 인자로 주어지는 정수 $M$은 ‘뒤집기’에서 뒤집는 카드의 간격을 나타낸다.
  • 인자로 주어지는 배열 $P$는 길이 $N$인 문자열 $N$개로 구성된 배열이며, $P[i]$는 만들어야 하는 패턴의 $i$번 행을 나타낸다.
  • 이 함수는 격자에 놓인 초기 배치로부터 ‘뒤집기’를 적용하여 패턴 $P$를 만들 수 있으면 true를, 그렇지 않으면 false를 반환해야 한다.

제출하는 소스 코드의 어느 부분에서도 입출력 함수를 실행해서는 안 된다.

데이터 범위

  • $1 \le M \le N \le 1000$
  • $P$에 속한 모든 문자는 ‘O’ 또는 ‘X’이다.

서브태스크

  1. (11 점)
    • $N \times M \le 10$
  2. (50 점)
    • $M = 1$
  3. (39 점)
    • 추가적인 제약 조건이 없다.

채점 기준

각 서브태스크의 점수는 그 서브태스크의 모든 데이터에 대한 점수 중 최솟값임에 유의하라.

样例

输入格式 1

5 2
XXXOX
XXXOX
OOOXO
XOXXX
XOXXX

输出格式 1

true

说明

Sample grader

Sample grader는 아래와 같은 형식으로 입력을 받는다.

N M
P[0]
P[1]
...
P[N-1]

Sample grader는 실제 채점에서 사용하는 그레이더와 다를 수 있음에 유의하라.

Discussions

About Discussions

The discussion section is only for posting: General Discussions (problem-solving strategies, alternative approaches), and Off-topic conversations.

This is NOT for reporting issues! If you want to report bugs or errors, please use the Issues section below.

Open Discussions 0
No discussions in this category.

Issues

About Issues

If you find any issues with the problem (statement, scoring, time/memory limits, test cases, etc.), you may submit an issue here. A problem moderator will review your issue.

Guidelines:

  1. This is not a place to publish discussions, editorials, or requests to debug your code. Issues are only visible to you and problem moderators.
  2. Do not submit duplicated issues.
  3. Issues must be filed in English or Chinese only.
Active Issues 0
No issues in this category.
Closed/Resolved Issues 0
No issues in this category.