BOJ 12698 Portal (Large)

BOJ 12698 Portal (Large)

문제 링크:

문제 내용

사각 격자로 이루어진 미로에서 포탈건을 사용하여 시작점에서 끝점으로 가는 최단 거리를 구하세요.

포탈건은 노란색과 파란색 중 하나를 선택한 뒤 현재 위치에서 상하좌우 중 한 방향으로 쏠 수 있으며, 그 방향의 가장 가까운 벽면에 그 색깔의 포탈이 만들어집니다.

노란색과 파란색의 포탈이 모두 열려 있는 상태에서, 한쪽 포탈이 열린 벽 안으로 이동하면 반대쪽 포탈이 열린 벽 밖으로 나오게 됩니다.

만약 이미 열려 있는 색깔의 포탈건을 쏘면, 기존의 그 색깔의 포탈은 닫히고 새로운 위치에 그 색깔의 포탈이 열립니다.

두 색깔의 포탈을 같은 벽면 위에 열 수 없습니다.

상하좌우로 한 칸 이동하는 데는 1의 시간이 걸리며, 포탈건을 쏴서 포탈이 만들어지기까지는 시간이 걸리지 않습니다.

입력

첫 줄에는 테스트 케이스의 개수 NN이 주어집니다. (1N501 \le N \le 50)

각 테스트 케이스에서, 첫 줄에는 행 개수 RR과 열 개수 CC가 주어지고, 그다음 RR줄에는 미로가 주어집니다. (1R,C151 \le R, C \le 15)

미로에서 O는 시작점, X는 도착점, .는 빈 공간, #는 벽을 나타냅니다. 미로의 바깥쪽은 벽으로 둘러싸여 있으며, 그러한 벽에도 포탈을 만들 수 있습니다.

출력

각 테스트 케이스에 대해, Case #<테스트 번호>:를 출력하고, 문제의 정답을 출력합니다. 어떻게 해도 도착점에 다다를 수 없다면 THE CAKE IS A LIE를 대신 출력합니다.

문제 풀이

스포일러

#12697 Portal (Small) 처럼 BFS로 풀려고 하면 메모리를 최적화하더라도 터치하는 상태가 RCRC의 세제곱에 비례하므로 TLE를 받습니다.

조금 생각해 보면, 포탈을 타고 효율적으로 이동하는 방법이 많지 않음을 알 수 있습니다.

  • 포탈을 타기 전에 같은 색의 포탈을 여러 번 여는 것은 의미가 없습니다.
  • 한쪽 색의 포탈을 일단 열었다면, 이를 이용하는 유일한 방법은 다른 색의 포탈을 다른 곳에 열어서 그 포탈로 들어가는 것입니다.
  • 다른 색의 포탈을 여는 가장 좋은 방법은 한쪽 색 포탈을 연 지점에서 가장 가까운 벽 앞으로 이동하여 그 벽에 다른 색 포탈을 열고 들어가는 것입니다.

따라서, 각각의 위치에서 상하좌우로 쐈을 때 포탈이 열리는 위치를 기록하고, 추가적으로 각각의 위치에서 가장 가까운 벽까지의 거리를 BFS를 이용하여 기록해 놓으면, 모든 유의미한 이동을 포함한 그래프를 얻을 수 있습니다. 이제 이 그래프에서 Dijkstra 등의 최단 거리 알고리즘을 사용하여 답을 구하면 됩니다.

Last updated on