만드는 중입니다

아직 만드는 중이라 바뀔 수 있습니다

Rätblocket

면접 대비

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

요약
1x1x2 블록을 A 칸에서 B 칸으로 굴릴 때 막힌 칸, 모듈로 칸, 스위치 칸이 있는 보드에서 최소 이동 횟수를 구합니다.
난이도

보통10점 중 5점

유형
BFS, 시뮬레이션
정답자
아직 제출이 없습니다

문제

Rätblocket은 빠르게 큰 인기를 얻은 모바일 게임이다. 목표는 휴대폰을 여러 방향으로 기울여 블록을 셀 AA에서 셀 BB까지 굴리는 것이다. 블록의 크기는 11x11x22이다. 보드는 11x11 크기의 셀로 이루어진 2차원 격자다. 어떤 셀은 자유롭게 지나갈 수 있고, 어떤 셀은 막혀 있다. 블록은 보드 밖으로 나갈 수 없다.

블록이 세워져 있는지 눕혀져 있는지에 따라 1개 또는 2개의 셀을 차지한다. 시작할 때 블록은 AA 표시된 셀에 세워져 있다. 목표는 블록을 BB 표시된 셀에 세워 두는 것이다. 블록의 절반만 BB 위에 걸쳐 있으면 목표를 달성한 것이 아니다. 블록은 위, 아래, 오른쪽, 왼쪽의 4가지 방향으로 움직일 수 있다. 한 번의 이동으로 블록은 주어진 방향으로 구른다. 그 방향에 막힌 셀이 있거나 보드가 끝나면 이동할 수 없다.

그림 4. 첫 번째 예시 문제 해법의 앞부분이다. 블록은 먼저 오른쪽으로 한 칸 구르고, 아래로 두 칸 구른 뒤, 마지막으로 왼쪽으로 한 칸 구른다.

보드에는 모듈로 셀이 있을 수 있다. 모듈로 셀은 00 또는 11의 두 가지 상태를 가진다. 상태가 00이면 자유로운 셀처럼 동작한다. 상태가 11이면 솟아올라 막힌 셀처럼 동작한다. 보드에는 스위치 셀(c로 표시)도 놓여 있을 수 있다. 블록이 스위치 셀 위에 서면 모든 모듈로 셀의 상태가 바뀐다. 00은 11이 되고, 11은 00이 된다.

그림 5. 세 번째 예시 문제에서 스위치를 작동하기 전과 후다.

모든 보드는 유효한 해가 항상 존재하도록 설계되어 있다. 여러분의 과제는 보드를 풀기 위해 필요한 최소 이동 횟수를 구하는 것이다.

입력

첫 줄에 두 정수 NN과 MM이 주어진다. 보드는 NN개의 행과 MM개의 열로 이루어져 있다. 이어지는 NN개의 줄에는 각각 MM개의 문자로 보드의 모습이 주어진다. 다음 문자가 나올 수 있다.

  • AA 또는 BB: 블록의 시작 위치와 도착 위치다.
  • . (마침표): 자유로운 셀이다.
  • #: 막힌 셀이다.
  • 00 또는 11: 주어진 시작 상태를 가진 모듈로 셀이다.
  • c: 스위치 셀이다.

각 보드에는 AA가 정확히 하나, BB가 정확히 하나 있다.

출력

블록을 셀 AA에서 셀 BB까지 굴리는 데 필요한 최소 이동 횟수를 정수 하나로 한 줄에 출력한다.

제한

배점 40점의 테스트 케이스에서 보드는 최대 77행 77열이며, 모듈로 셀은 없다. 나머지 60점의 테스트 케이스에서는 풀이가 모듈로 셀도 처리할 수 있어야 한다.

예제3

  1. 예제 1

    입력
    3 3
    A..
    ...
    ..B
    
    예상 출력
    8
    
  2. 예제 2

    입력
    3 5
    A#...
    .....
    ...#B
    
    예상 출력
    14
    
  3. 예제 3

    입력
    3 7
    A..#...
    .B.1...
    ..c#...
    
    예상 출력
    27