본문 바로가기

BOJ/C++

[BOJ] 3190. 뱀

[문제]

 'Dummy' 라는 도스게임이 있다. 이 게임에는 뱀이 나와서 기어다니는데, 사과를 먹으면 뱀 길이가 늘어난다. 뱀이 이리저리 기어다니다가 벽 또는 자기자신의 몸과 부딪히면 게임이 끝난다.

게임은 NxN 정사각 보드위에서 진행되고, 몇몇 칸에는 사과가 놓여져 있다. 보드의 상하좌우 끝에 벽이 있다. 게임이 시작할때 뱀은 맨위 맨좌측에 위치하고 뱀의 길이는 1 이다. 뱀은 처음에 오른쪽을 향한다.

뱀은 매 초마다 이동을 하는데 다음과 같은 규칙을 따른다.

  • 먼저 뱀은 몸길이를 늘려 머리를 다음칸에 위치시킨다.

  • 만약 이동한 칸에 사과가 있다면, 그 칸에 있던 사과가 없어지고 꼬리는 움직이지 않는다.

  • 만약 이동한 칸에 사과가 없다면, 몸길이를 줄여서 꼬리가 위치한 칸을 비워준다. 즉, 몸길이는 변하지 않는다.

사과의 위치와 뱀의 이동경로가 주어질 때 이 게임이 몇 초에 끝나는지 계산하라.

 

[풀이]

 

1) 단순하게 큐의 size = 뱀의 몸 길이 

1-1) map[][] = 0 ( 빈칸) 1 (뱀) 2 (사과)

 

2) 나아가는 방향이 빈칸(0) 이면 큐의 첫 번째 원소 (꼬리)를 큐에서 제거하고 (pop) 그 자리를 0으로 만들어준다. 

 

3) 나아가는 방향이 벽이거나 뱀(1) 이면 반복문을 중지하고 게임이 끝난다. 

 

4) 그 외이면 큐에 해당 좌표를 넣어준다. 그리고 그 자리를 뱀(1)로 만들어준다. (뱀의 몸길이 + 1)

 

5) x시간 후에는 방향을 전환한다. 

         L D

    상 좌 우

    하 우 좌

    좌 하 상

    우 상 하

 

직접 그림을 그려서 생각해보니 이런 결과가 나왔다. 이대로 방향을 리턴하는 함수를 작성하면 된다. 

'BOJ > C++' 카테고리의 다른 글

[BOJ] 14890. 경사로  (0) 2019.08.02
[BOJ] 14500. 테트로미노  (0) 2019.08.02
[BOJ] 14499. 주사위굴리기  (0) 2019.08.02
[BOJ] 12100. 2048(easy)  (0) 2019.08.01
[BOJ] 11066. 파일 합치기  (0) 2019.04.29