페이지가 로드되지 않나요? 여기를 눌러보면 고쳐질 수도 있어요.
Placeholder

#4481

스네이크 1s 32MB

문제

현민이는 유명한 고전게임 “스네이크”를 자기만의 버전으로 다시 만들어보려고 한다.

그림 1(출처: Play Store). 최근에 리메이크된 스네이크 게임

“스네이크”는 다들 알다시피 뱀을 움직여서 화면상에 존재하는 모든 사과를 다 먹는 게임이다.

(만약 게임을 모른다면 꼭! 한번 해보기 바란다.)​

현민이 버전의 “스네이크”는 다음과 같은 규칙을 가진다.

-      원본 게임과 달리, 현민이의 게임에서는 모든 사과의 위치가 다 주어진 채 시작한다. (원래 사과는 하나씩만 보이고, 그 사과를 먹어야 다음 사과가 나타난다.) 

-      처음 뱀은 화면의 한 칸만을 차지한다.

-      뱀의 처음 위치는 화면의 제일 왼쪽 아래이며, 오른쪽을 바라보고 있다.

-      게임을 하는 플레이어는 A와 B 두 개의 버튼만 가지고 게임을 즐긴다.

-      버튼 A를 누르면 뱀은 자기가 바라보고 있는 방향으로 한 칸을 움직인다. 만약 바라보고 있는 방향이 화면 바깥이라면, 뱀은 움직이지 않는다.

-      버튼 B를 누르면 뱀은 한 칸 위로 움직인 후, B를 누르기 전 보고 있던 방향에서 180도 회전한 방향을 바라본다.

-      원본 게임과 마찬가지로 뱀이 움직인 위치에 사과가 있으면, 뱀은 그 사과를 먹는다. (모두 알다시피, 사과를 먹은 뱀은 몸길이가 한 칸만큼 길어지나, 잘 생각해 보면 이 게임에서 크게 의미 있는 규칙은 아니다. 어차피 사과를 먹는 주체는 뱀의 "머리"이기 때문이다.)

현재 화면의 상태가 주어졌을 때, 게임상의 뱀이 모든 사과를 다 먹게 하기 위하여 플레이어가 눌러야 하는 버튼 개수의 최솟값을 출력하라.


입력

첫 줄에 R과 S가 주어진다. R은 화면의 세로 길이, S는 가로의 길이이다.

다음 R줄에 걸쳐서 S개의 문자가 공백을 사이에 두지 않고 주어진다. 이는 화면상의 각 칸의 상태를 나타낸다. ‘Z’는 뱀, ‘J’는 사과, ‘.’은 아무것도 없는 빈 칸이다.

부분문제의 제약 형식 

​2≤R,S≤1,000을 만족하며, R, S는 당연히 정수이다. 뱀의 위치를 나타내는 ‘Z’는 항상 화면의 왼쪽 맨 밑이다.


출력

첫 줄에 뱀이 모든 사과를 다 먹게 하기 위하여 플레이어가 눌러야 할 버튼 수의 최솟값을 출력한다.


부분문제

번호 점수 조건
#16점

총 R-1개의 사과가 주어지며, 사과는 화면의 왼쪽에만 위치한다.

#223점

R≤4, S≤4

#313점

가로줄에는 항상 한 개의 사과만이 존재한다.

#458점

주어진 제약조건 외에 아무 제약조건이 없다.​ 


예제 #1

5 5

...J.
.....
J..J.
J....
Z....
7

예제 #2

5 5

.....
J...J
.J.J.
.JJJ.
Z....
15

출처

Croatian Highschool Competitions in Informatics 2014/2015, Open #5 Problem #2
로그인해야 코드를 작성할 수 있어요.