달이 차오르는 미로 탈출

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

요약
격자 미로에서 열쇠를 모아 문을 열며 출구까지 가는 최소 이동 횟수를 상태(키 보유 여부)를 포함한 BFS로 구하는 문제입니다.
난이도

보통10점 중 6점

유형
BFS, 비트 연산, 그래프
정답자
아직 제출이 없습니다

문제

민식이는 직사각형 미로 안에 있다. 미로에서 탈출하려면 출구 칸으로 이동해야 한다. 한 번의 이동은 현재 칸에서 상하좌우로 인접한 한 칸으로 이동하는 것이다.

미로의 각 칸은 다음 중 하나이다.

  • 빈 칸 .: 언제나 이동할 수 있다.
  • 벽 #: 이동할 수 없다.
  • 열쇠 a~f: 언제나 이동할 수 있으며, 처음 들어가면 해당 열쇠를 얻는다.
  • 문 A~F: 대응하는 소문자 열쇠를 가진 경우에만 이동할 수 있다.
  • 시작 위치 0: 민식이가 처음 서 있는 빈 칸이다.
  • 출구 1: 이 칸에 도착하면 미로를 탈출한다.

열쇠는 얻은 뒤 계속 사용할 수 있다. 민식이가 출구 중 하나에 도착하기 위해 필요한 이동 횟수의 최솟값을 구하시오.

입력

첫째 줄에 미로의 세로 크기 N과 가로 크기 M이 주어진다. (1 <= N, M <= 50)

둘째 줄부터 N개의 줄에 미로의 모양이 주어진다. 같은 종류의 열쇠나 문이 여러 개 있을 수 있으며, 어떤 문은 대응하는 열쇠가 미로에 없을 수도 있다. 0은 정확히 한 개이고, 1은 한 개 이상 있다. 열쇠는 여러 번 사용할 수 있다.

출력

민식이가 미로를 탈출하는 데 필요한 이동 횟수의 최솟값을 출력한다. 탈출할 수 없으면 -1을 출력한다.

예제8

  1. 예제 1

    입력
    1 7
    f0.F..1
    
    예상 출력
    7
    
  2. 예제 2

    입력
    5 5
    ....1
    #1###
    .1.#0
    ....A
    .1.#.
    
    예상 출력
    -1
    
  3. 예제 3

    입력
    7 8
    a#c#eF.1
    .#.#.#..
    .#B#D###
    0....F.1
    C#E#A###
    .#.#.#..
    d#f#bF.1
    
    예상 출력
    55
    
  4. 예제 4

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

    입력
    3 5
    ..0..
    .###.
    ..1.A
    
    예상 출력
    6
    
  6. 예제 6

    입력
    4 5
    0....
    .#B#A
    .#.#.
    b#a#1
    
    예상 출력
    19
    
  7. 예제 7

    입력
    1 11
    c.0.C.C.C.1
    
    예상 출력
    12
    
  8. 예제 8

    입력
    3 6
    ###...
    #0A.1a
    ###...
    
    예상 출력
    -1