절벽 오르기
면접 대비시간 제한1초메모리 제한128 MB
발을 번갈아 옮기며 거리 조건을 지켜야 하는 격자 오르기에서 맨 아래 S 블록에서 맨 위 T 블록까지 도달하는 최소 시간을 구한다.
문제
17시 정각, 특수요원 잭이 적진에서 탈출을 시작한다. 적진과 가장 가까운 안전지대 사이에는 거의 수직에 가까운 절벽이 놓여 있다. 잭은 절벽을 뒤덮은 블록에 발을 디디며 이 절벽을 올라가야 한다. 일부 블록은 미끄러워서 발을 안전하게 디디는 데 시간이 걸리고, 어떤 블록은 잭의 무게를 견디지 못할 만큼 약해서 밟을 수 없으므로 피해서 지나가야 한다. 절벽을 다 오르는 데 걸리는 최소 시간을 구하는 프로그램을 작성하라.
절벽은 정사각형 블록으로 덮여 있다. 잭은 절벽 아래 지면에서 출발하여, 맨 아래 줄에 있는 'S' 블록 중 하나에 왼발 또는 오른발을 디디면서 오르기를 시작한다. 블록에 적힌 숫자는 그 블록의 "미끄럼 정도"이다. ()라고 적힌 블록에 발을 안전하게 디디는 데에는 만큼의 시간이 걸린다. 'X'로 표시된 블록에는 발을 디딜 수 없다. 맨 위 줄에 있는 'T' 블록 중 하나에 어느 한쪽 발이라도 닿으면 오르기가 끝난다.
잭의 이동은 다음 제약을 만족해야 한다. 왼발(또는 오른발)을 어떤 블록에 디딘 다음에는, 반드시 오른발(또는 왼발)만 움직일 수 있다. 즉 두 발은 번갈아 움직인다. 왼발의 위치 와 오른발의 위치 는 항상 이고 을 만족해야 한다. 따라서 왼발의 위치가 정해지면, 오른발은 이 조건을 만족하는 9개의 블록 중 하나에 놓아야 한다. 마찬가지로 오른발의 위치가 정해지면, 왼발도 조건을 만족하는 9개의 블록 중 하나에 놓아야 한다.
입력
입력은 여러 개의 데이터셋으로 이루어진다. 입력의 끝은 공백으로 구분된 두 개의 0(0 0)만 있는 줄로 표시된다. 각 데이터셋의 형식은 다음과 같다.
w h
s(1,1) ... s(1,w)
s(2,1) ... s(2,w)
...
s(h,1) ... s(h,w)
정수 와 는 각각 절벽 블록 행렬의 너비와 높이이며, , 이다. 이어지는 개의 줄은 각각 공백으로 구분된 개의 문자로 이루어진다. 문자 는 위치 에 있는 블록의 상태를 나타내며, 그 의미는 다음과 같다.
- 'S': 잭이 오르기를 시작할 수 있는 블록이다.
- 'T': 이 블록에 닿으면 오르기가 끝난다.
- 'X': 발을 디딜 수 없는 블록이다.
- '1'–'9'(): 어느 한쪽 발이든 이 블록에 디디는 데 만큼의 시간이 걸린다.
'S' 또는 'T' 블록에 발을 디디는 데에는 시간이 걸리지 않는다고 가정한다.
출력
각 데이터셋에 대해, 잭이 절벽 오르기를 완료할 수 있는 경우 필요한 최소 시간을 10진 정수 하나만 담은 줄을 출력한다. 완료할 수 없는 경우에는 "-1"만 담은 줄을 출력한다. 각 줄에는 이 숫자 외의 다른 문자가 없어야 한다.