아직 만들고 있는 페이지입니다.

이 페이지는 아직 만드는 중입니다. 보이는 내용은 바뀔 수 있습니다.

게으른 고양이

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

요약
벽을 피해 S에서 출발해 모든 먹이를 먹고 침대까지 가는 가장 짧은 걸음 수를 구합니다.
난이도

보통10점 중 6점

유형
동적 계획법, BFS, 비트 연산
정답자
아직 제출이 없습니다

문제

집의 지도는 n×nn \times n 격자로 주어진다. 아래는 4×44 \times 4 지도의 예다.

BF
XXF
FXXF
S

벽은 'X', 먹이는 'F', 하나뿐인 침대는 'B'로 나타낸다. 고양이는 'S' 칸에서 출발하고, 'S'는 격자 어느 칸에나 놓일 수 있다. 고양이는 상하좌우로 한 칸씩만 움직이며 'X' 칸에는 들어가지 못한다. 모든 먹이를 먹고 침대에 도착하는 데 필요한 최소 이동 횟수를 구하라.

입력

첫째 줄에 격자의 크기 nn이 주어진다. (2≤n≤302 \le n \le 30)

다음 nn개 줄에는 각각 문자 nn개가 주어지고, 각 문자는 그 칸의 상태를 나타낸다. 침대는 'B', 먹이는 'F', 벽은 'X', 빈 칸은 숫자 0, 고양이가 출발하는 칸은 'S'다. 알파벳은 모두 대문자다. 'B'와 'S'는 각각 한 번씩 나오고, 'F'는 적어도 한 번, 많아야 열 번 나온다.

출력

모든 먹이를 먹은 뒤 침대에 도착하는 데 필요한 최소 이동 횟수를 한 줄에 출력한다. 모든 먹이를 먹고 침대까지 가는 방법이 없으면 대신 -1을 출력한다.

예제3

  1. 예제 1

    입력
    4
    B0F0
    XXF0
    FXXF
    S000
    
    예상 출력
    11
    
  2. 예제 2

    입력
    2
    SF
    XB
    
    예상 출력
    2
    
  3. 예제 3

    입력
    3
    SXF
    0X0
    BX0
    
    예상 출력
    -1