구슬 탈출 4

빨간 구슬과 파란 구슬, 구멍 하나가 있는 작은 보드에서 판을 기울여 파란 구슬은 빠지지 않으면서 빨간 구슬만 구멍으로 떨어뜨리는 최소 기울임 횟수를 구하고, 불가능하면 -1을 출력한다.

보통7BFS시뮬레이션그래프구현면접 대비아직 제출이 없습니다시간 제한2초메모리 제한512 MB

문제

직사각형 보드에 빨간 구슬과 파란 구슬을 하나씩 넣은 다음, 빨간 구슬을 구멍으로 빼내는 게임이 있다.

보드의 세로 크기는 NN, 가로 크기는 MM이고, 보드는 1×11 \times 1 크기의 칸으로 나뉘어 있다. 가장 바깥 행과 열은 모두 막혀 있고, 보드에는 구멍이 하나 있다. 빨간 구슬과 파란 구슬은 1×11 \times 1 칸을 가득 채우는 크기이고, 각각 하나씩 놓여 있다. 게임의 목표는 빨간 구슬을 구멍으로 빼내는 것이다. 이때 파란 구슬이 구멍에 들어가면 안 된다.

구슬을 손으로 건드릴 수는 없고, 중력을 이용해 이리저리 굴려야 한다. 왼쪽으로 기울이기, 오른쪽으로 기울이기, 위쪽으로 기울이기, 아래쪽으로 기울이기의 네 가지 동작이 가능하다.

각각의 동작에서 두 구슬은 동시에 움직인다. 빨간 구슬이 구멍에 빠지면 성공이지만, 파란 구슬이 구멍에 빠지면 실패다. 빨간 구슬과 파란 구슬이 동시에 구멍에 빠져도 실패다. 빨간 구슬과 파란 구슬은 같은 칸에 함께 있을 수 없고, 각각 한 칸을 모두 차지한다. 한 번 기울이면 구슬이 더 이상 움직이지 않을 때까지 굴러간다.

보드의 상태가 주어졌을 때, 최소 몇 번 만에 빨간 구슬을 구멍으로 빼낼 수 있는지 구하는 프로그램을 작성하시오.

입력

첫째 줄에 보드의 세로 크기와 가로 크기를 뜻하는 두 정수 NN, MM이 주어진다. (3N,M103 \le N, M \le 10)

다음 NN개 줄에 보드의 모양을 나타내는 길이 MM의 문자열이 주어진다. 이 문자열은 '.', '#', 'O', 'R', 'B'로 이루어져 있다. '.'은 빈 칸을 뜻하고, '#'은 구슬이 지나갈 수 없는 장애물이나 벽을 뜻하며, 'O'는 구멍의 위치를 뜻한다. 'R'은 빨간 구슬의 위치, 'B'는 파란 구슬의 위치다.

입력으로 주어지는 보드의 가장자리는 모두 '#'이다. 구멍은 한 개이고, 빨간 구슬과 파란 구슬도 항상 한 개씩 주어진다.

출력

빨간 구슬을 구멍으로 빼내는 데 필요한 최소 기울이기 횟수를 출력한다. 어떻게 움직여도 빨간 구슬을 구멍으로 빼낼 수 없으면 -1을 출력한다.