본문 바로가기
알고리즘/백준

[백준 3190] 뱀 (C++)

by Bloofer 2020. 5. 27.

A. 문제설명

https://www.acmicpc.net/problem/3190

문제에 대한 자세한 설명은 링크 참조

 

1. 크기가 N×N인 지도가 존재

2. 뱀은 (0, 0) 좌표에서 우측으로 이동시작하는데, 아래와 같은 규칙으로 이동

2-1. 먼저 뱀은 몸길이를 늘려 머리를 다음칸에 위치

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

2-3. 만약 이동한 칸에 사과가 없다면, 몸길이를 줄여서 꼬리가 위치한 칸을 비워줌

3. 수초가 지났을 때 입력으로 들어온 방향전환 명령에 따라 방향을 전환

4. 뱀이 벽이나 자기자신에 부딫히면 종료

5. 마지막으로 종료된 시간 반환

 

B. 접근법

시뮬레이션

 

Dummy 게임에 대한 시뮬레이션을 충실히 구현하자. 뱀의 좌표에 대한 HEAD/TAIL을 저장하여 이동시 업데이트

꼬리에서 머리로 따라가는 뱀의 이동방향은 큐로 구현하여 뱀의 이동을 모사

 

C. 풀이

1. 무한루프 진입

2. 매 초마다 뱀은 방향전환 명령이 있다면 새로 방향을 전환

3. 뱀은 현재 이동방향을 보고 다음 위치가 가용한지 확인

3-1. 만약 다음 위치가 뱀의 몸에 해당하거나 벽인 경우 종료

3-2. 다음 위치가 사과인 경우 사과로 HEAD를 이동하여 사과를 먹고 몸길이 1 증가(꼬리 이동 X)

3-3. 다음 위치가 비어있는 경우 HEAD를 이동, TAIL도 따라서 이동

4. 종료될 때까지 2부터 반복

 

D. 내 코드