페이지가 로드되지 않나요? 여기를 눌러보면 고쳐질 수도 있어요.
Placeholder

#2622

[고등부] 2025 KOI 2차대회 대비 모의고사 (2회차)

몬스터와 함께하는 여행 5초 512MB

문제

지우는 광활한 필드에서 여행을 하려고 한다.

필드는 HW열의 격자 모양으로, 필드의 각 칸에는 땅이나 장애물(벽)이 있다.

지우가 필드에서 이동할 때 현재 위치에서 상, 하, 좌, 우 네 방향으로 이동할 수 있으며,
필드의 범위를 벗어난 방향 또는 벽이 있는 방향으로는 이동할 수 없다.

필드에는 P개의 마을이 있어서 각 마을에는 몬스터 치료소가 있다.

반대로, 마을이 없는 땅에는 강력한 야생 몬스터가 한 마리 살고 있어서 해당 땅을 지나가는 사람들을 공격한다.

지우는 안전한 여행을 위해 몬스터를 몇 마리 데리고 가려고 한다.

지우가 자기 몬스터들을 데리고 마을에 있는 몬스터 치료소에 방문하면 쓰러진 몬스터들을 모두 회복시킬 수 있다.

만약 지우가 마을이 없는 땅에 방문한다면 야생 몬스터가 지우가 데리고 있는 살아있는 몬스터를 한 마리 공격한다.

공격받은 몬스터는 쓰러지며 몬스터 치료소에 방문하여 치료하기 전까지는 되살아나지 않는다.

만약 지우의 모든 몬스터가 쓰러진 상태에서 야생 몬스터를 만난다면 야생 몬스터가 지우를 공격하게 되어 지우가 쓰러진다.

같은 지역에 여러 번 방문한다면 야생 몬스터는 해당 지역에 방문할 때마다 공격을 실시한다.

지우는 자신이 공격받지 않도록 몬스터를 적당히 데리고 한 마을에서 다른 마을로 여행하려고 한다.

하지만 몬스터를 너무 많이 데리고 간다면 짐가방이 무거워지므로 몬스터는 가능한 한 최소한만 데리고 가려고 한다.

지우의 여행계획 Q개에 대하여 해당 여행에 필요한 최소 몬스터 수를 구하는 프로그램을 작성하여라.


입력

첫 번째 줄에는 필드의 세로, 가로 크기 H, W 및 마을의 수 P, 질문의 수 Q가 주어진다.

다음 H개의 줄에는 필드의 정보를 나타내는 .#로 이루어진 길이 W의 문자열이 주어진다.
필드의 각 칸이 땅인 경우 .이고 벽인 경우 #이다.

다음 P개의 줄에는 j번째(1 \le j \le P) 마을의 위치 A_j, B_j가 주어진다.
이는 마을 j가 격자의 A_jB_j열에 있다는 것을 의미한다. 마을이 있는 곳은 필드에서 무조건 땅(.)이어야 한다.

다음 Q개의 줄에는 i번째(1 \le i \le Q) 질문의 정보 S_i, T_i가 주어진다.
이는 마을 S_i에서 마을 T_i까지 가는 데 필요한 몬스터의 최대 체력을 의미한다.

제한

  • 1 ≤ H ≤ 2 000

  • 1 ≤ W ≤ 2 000

  • 2 ≤ P ≤ 200 000

  • 1 ≤ Q ≤ 200 000

  • 1 ≤ Aj ≤ H (1 ≤ j ≤ P)

  • 1 ≤ Bj ≤ W (1 ≤ j ≤ P)

  • (Ai, Bi) ≠ (Aj, Bj) (1 ≤ i < j ≤ P)

  • 1 ≤ Si < Ti ≤ P (1 ≤ i ≤ Q)


출력

Q개의 줄에 걸쳐 정답을 출력한다.

i번째 줄에는 마을 S_i에서 마을 T_i까지 여행하기 위해서 필요한 몬스터의 수를 출력한다. 만약 몬스터 없이 여행이 가능하다면 0을 출력하고 마을 간 여행이 불가능하다면 -1을 출력한다.


부분문제

번호 점수 조건
#110점

H \le 100, W \le 100, P \le 100

#230점

P \le 5\,000, Q = 1

#330점

P \le 5\,000, Q \le 10\,000

#430점

추가 제약 조건은 없다.


예제 #1

5 5 4 4
.....
..##.
.#...
..#..
.....
1 1
4 2
3 3
2 5
1 2
2 4
1 3
3 4
3
4
4
2

입력으로 주어진 필드의 모양은 아래와 같다. 격자 내 숫자는 마을을, ■는 벽을 의미한다.

해당 필드에서 두 번째 질문(마을 2 → 마을 4)의 여행경로로 가능한 예시는 아래와 같다.

왼쪽 방법은 야생 몬스터한테 6번의 공격을 받고 오른쪽 방법은 야생 몬스터한테 7번의 공격을 받는다. 하지만 오른쪽 방법에서는 1번 마을에서 몬스터를 치료할 수 있기 때문에 몬스터를 4마리만 갖고 가더라도 충분하다. 몬스터를 3마리 이하로 들고 가는 방법은 존재하지 않는다.


예제 #2

5 5 3 2
...#.
..#..
#....
.##..
...#.
1 3
5 2
1 5
1 2
1 3
-1
7
로그인해야 코드를 작성할 수 있어요.