문제 설명(링크)
https://www.acmicpc.net/problem/21794
21794번: Navigation 2
C++17, C++14, C++20, C++14 (Clang), C++17 (Clang), C++20 (Clang)
www.acmicpc.net
풀이
14는 조금 어렵고, 13은 어렵고, 12는 더 어렵다.
14 풀이
x좌표, y좌표가 3의 배수인 칸마다 14를 쓴다. 하나의 14 주위의 8개의 칸을 다음과 같이 번호를 붙이자.
0 1 2
3 14 4
5 6 7
7번 칸은 현재는 사용하지 않는다. 아무 수나 채우자.
14가 가운데에 위치한 3*3의 영역을 블럭이라 하자. 한 블럭의 14를 기준으로, 그 블럭과 $i$번째 도착점의 상대적인 위치관계를 아래 표와 같이 표시하자. 14가 있는 칸에 도착점이 있으면 5, 한칸 위에 있으면 2, 한칸 오른쪽에 있으면 6이 되는 방식이다.
12 | 12 | 12 | 12 | 12 | 12 | 12 |
12 | 12 | 12 | 12 | 12 | 12 | 12 |
12 | 12 | 1 | 2 | 3 | 12 | 12 |
10 | 10 | 4 | 5(14가 있는 칸) | 6 | 11 | 11 |
13 | 13 | 7 | 8 | 9 | 13 | 13 |
13 | 13 | 13 | 13 | 13 | 13 | 13 |
13 | 13 | 13 | 13 | 13 | 13 | 13 |
한 블럭의 0-6의 위치에 대해 각 칸을 기준으로 하는 상대적인 위치를 작성한다. 이렇게 하면 14 주위 8칸에서 각 도착점으로 가기 위해 어디로 가야 하는지 찾을 수 있다.
12 | 2 | 7 |
1 | 3 | 14 |
2 | 5 | 12 |
위와 같이 쿼리가 주어진 경우를 보자. 우선 가운데 칸을 $(a, b)$라 하자. 14가 한칸 오른쪽에 있으므로, $(a, b-2)$에도 14가 쓰여 있다. 따라서, 14가 아닌 수들은 다음과 같은 번호의 도착점을 나타내고 있다.
2 | 0 | 1 |
4 | 3 | x |
x | 5 | 6 |
0번 도착지점의 경우, $(a-1, b)$을 기준으로 바로 한 칸 위에 위치한다. 즉 좌표는 $a-2, b$이고, 위로 이동해야 한다.
6번 도착지점의 경우, 목적지로 도달하기 위해서는 위쪽과 오른쪽으로 적어도 두 번 이동해야 한다. 따라서 도착지의 $x$좌표는 $a-1$ 이하이다. 따라서 위쪽으로 가도 된다.
이와 같은 방법으로 모든 지점에 대해 답을 구할 수 있다.
13 풀이
이젠 13을 쓴 칸이 14 풀이의 14를 쓴 칸 역할을 대신한다. 13을 쓴 칸이 꼭 x, y 좌표가 3의 배수일 필요는 없다. 제일 왼쪽 위의 14 칸으로 가능한 9가지 선택지가 있는데, 이 중 2개의 경우는 반드시 다음 조건을 만족한다.
* 14의 풀이대로 숫자를 적었을 때, 14가 적히지 않은 모든 칸 $(a, b)$에 대하여 숫자 5가 한 번도 사용되지 않는 경우가 있다.
비둘기집의 원리로 증명할 수 있다. 제일 왼쪽 위의 14 칸으로 가능한 9가지 선택지가 있는데, 도착지는 7개이기 때문이다.
따라서 도착지의 상대적인 위치를 표시할 때 숫자 5는 사용하지 않으며, 따라서 12개의 숫자만으로도 할 수 있다.
11 | 11 | 11 | 11 | 11 | 11 | 11 |
11 | 11 | 11 | 11 | 11 | 11 | 11 |
11 | 11 | 1 | 2 | 3 | 11 | 11 |
9 | 9 | 4 | 필요 없다 | 5 | 10 | 10 |
12 | 12 | 6 | 7 | 8 | 12 | 12 |
12 | 12 | 12 | 12 | 12 | 12 | 12 |
12 | 12 | 12 | 12 | 12 | 12 | 12 |
12 풀이
12의 풀이와 유사하다. 도착지의 상대적인 위치를 표시할 때 기준이 되는 칸 주위의 칸들을 표시하기 위해 8개의 숫자를 쓰고, 멀리 있는 칸들을 표시하기 위해 4개의 숫자를 쓴다. 이때, 처음 8개의 숫자가 모두 쓰이지 않는다. 왜냐하면, 각 도착지 $i$를 표시하는 칸들은 $x$, $y$좌표 모두 거리가 3씩 띄워져 있어서 이들 중 1-8의 숫자를 사용하는 칸은 최대 하나밖에 없기 때문이다. 이로 인해 1-8의 숫자 중 최대 7가지의 숫자만 쓰여서 비둘기집의 원리에 의해 성립한다.
앞에서는 사용하지 않았던 7번 칸에 이 사용되지 않은 수를 적어두자. 이 수를 $x$라 하면, $x$초과의 모든 수는 1을 빼서 쓰고, 그렇지 않은 수는 그대로 쓰자. 이렇게 하면 B 입장에서는 12의 위치를 통해 $x$를 복원하여 원래 배열을 복원할 수 있다.
소스코드
https://oj.uz/submission/478043
답안 #478043 :: oj.uz
oj.uz
'문제풀이' 카테고리의 다른 글
1월 25일 연습 (JOIOC 2022) (2) | 2023.01.26 |
---|---|
JOI Open Contest 2017 (2) | 2023.01.23 |
백준 15776 New Home (APIO 2018 A번) (0) | 2021.09.03 |
백준 18847. Stray Cat (JOISC 2019/2020 Day 3 3번) (0) | 2021.09.01 |
백준 15261 Donut Drone (CERC 2017 D) (0) | 2021.08.19 |