상자 배달

1×1×3 상자가 격자에서 90도씩 구르며 목적지 칸에 닿는 최소 굴림 횟수를 구한다. 상자가 안정적으로 놓이는 자세는 두 가지다.

보통7BFS그래프구현시뮬레이션아직 제출이 없습니다시간 제한1초메모리 제한256 MB

문제

택배 기사는 상자 하나를 손님 집까지 옮겨야 한다. 상자를 들 수는 없어서 굴려서 옮기기로 했다.

상자는 1×1×31 \times 1 \times 3 크기이고, 처음에는 1×11 \times 1 면이 바닥에 닿은 채로 서 있다.

지도는 n×mn \times m 격자이고, 칸마다 땅이거나 싱크홀이다. 한 번 굴리면 상자는 바닥에 닿아 있는 변 하나를 축으로 90도 돌아가고, 굴린 자리에서 버텨야 한다.

  • 1×11 \times 1 면이 바닥일 때는 그 칸이 땅이어야 한다.
  • 1×31 \times 3 면이 바닥일 때는 닿는 세 칸 중 양 끝이 모두 땅이거나 가운데가 땅이어야 한다.

둘 다 만족하지 못하면 상자는 구멍으로 떨어지고 더는 옮길 수 없다. 상자가 닿는 칸은 항상 지도 안에 있어야 한다.

시작 위치와 목적지가 주어질 때 상자를 목적지까지 옮기는 최소 굴리기 횟수를 구하여라. 목적지에서 상자가 서 있을 필요는 없다. 상자가 닿는 칸 가운데 하나가 목적지이기만 하면 된다.

입력

첫째 줄에 지도의 세로 크기 nn과 가로 크기 mm이 주어진다 (1n5001 \le n \le 500, 1m5001 \le m \le 500).

다음 nn개 줄에는 mm개의 숫자가 공백 없이 주어진다. 0은 싱크홀, 1은 땅, 2는 상자의 시작 위치, 3은 목적지다. 2와 3은 각각 정확히 한 번 나오고, 두 칸 모두 땅이다.

출력

상자를 목적지까지 옮기는 최소 굴리기 횟수를 출력한다. 옮길 수 없으면 -2를 출력한다.