상자 밀기

면접 대비

시간 제한1초메모리 제한128 MB

요약
미로에서 플레이어가 상자를 밀어 목표 칸까지 옮길 때, 최소 밀기 횟수와 그 조건에서의 최소 총 이동 횟수를 구한다.
난이도

보통10점 중 7점

유형
BFS, 최단 경로, 그래프, 구현
정답자
아직 제출이 없습니다

문제

정사각형 칸으로 이루어진 2차원 미로 안에 서 있다고 상상해 봅시다. 각 칸은 바위로 막혀 있거나 비어 있습니다. 지금 서 있는 칸에서 북, 남, 동, 서 중 한 방향으로 인접한 빈 칸으로 한 칸 이동할 수 있으며, 이렇게 빈 칸으로 옮겨 가는 것을 걷기라고 부릅니다.

빈 칸 중 하나에는 상자가 놓여 있습니다. 상자와 붙어 있는 칸에 서서 상자 쪽으로 걸어가면 상자를 밀 수 있습니다. 그러면 상자는 바로 앞의 빈 칸으로 한 칸 밀려나고, 당신은 상자가 있던 칸으로 들어갑니다. 이 동작을 밀기라고 합니다. 상자는 오직 밀어서만 움직일 수 있으므로, 한 번 구석으로 밀어 넣으면 다시는 빼낼 수 없습니다.

빈 칸 중 하나는 목표 칸입니다. 걷기와 밀기를 적절히 사용하여 상자를 목표 칸까지 옮기는 것이 목표입니다. 상자가 매우 무겁기 때문에, 밀기 횟수를 최소로 하고 싶습니다.

입력

입력은 여러 개의 미로로 이루어져 있습니다. 각 미로는 행의 수 rr과 열의 수 cc(둘 다 2020 이하)를 담은 한 줄로 시작합니다.

이어지는 rr개의 줄에는 각각 cc개의 문자가 있어 미로의 한 행을 나타냅니다. 각 문자의 의미는 다음과 같습니다.

  • # — 바위로 가득 찬 칸
  • . — 빈 칸
  • S — 당신의 시작 칸(빈 칸)
  • B — 상자의 시작 칸(빈 칸)
  • T — 목표 칸(빈 칸)

모든 미로에는 S, B, T가 각각 정확히 하나씩 있습니다. 입력은 0 0이 적힌 줄로 끝나며, 이 줄은 미로가 아닙니다.

출력

미로에 나타난 순서대로 1,2,3,…1, 2, 3, \dots 번호를 매깁니다. 각 미로에 대해 먼저 Maze #k 줄을 출력합니다. 여기서 k는 미로의 번호입니다.

다음 줄에는 결과를 출력합니다.

  • 상자를 목표 칸으로 옮길 수 없다면 Impossible. 을 출력합니다.
  • 그렇지 않으면 두 정수를 공백 하나로 구분하여 출력합니다. 첫 번째 정수는 가능한 최소 밀기 횟수이고, 두 번째 정수는 그 최소 밀기 횟수를 사용하는 모든 방법 중에서 총 이동 횟수(걷기와 밀기의 합)가 최소가 되는 값입니다.

각 미로를 출력한 뒤에는 빈 줄을 하나 출력합니다.

예제3

  1. 예제 1

    입력
    1 7
    SB....T
    1 7
    SB..#.T
    7 11
    ###########
    #T##......#
    #.#.#..####
    #....B....#
    #.######..#
    #.....S...#
    ###########
    8 4
    ....
    .##.
    .#..
    .#..
    .#.B
    .##S
    ....
    ###T
    0 0
    
    예상 출력
    Maze #1
    5 5
    
    Maze #2
    Impossible.
    
    Maze #3
    6 28
    
    Maze #4
    3 19
    
    
  2. 예제 2

    입력
    1 5
    .SBT.
    0 0
    
    예상 출력
    Maze #1
    1 1
    
    
  3. 예제 3

    입력
    1 5
    TB.S.
    0 0
    
    예상 출력
    Maze #1
    1 2