오락실에 있는 고전 뱀 게임이다.
사과 먹으면 뱀 길이가 길어지는데
벽이나 자신의 몸에 부딪히면 죽는다.
게임이 총 몇 초(몇 회)만에 끝나는지 구하면 된다.
이 문제는 뱀의 처음 위치(1,1)에서 시작하며,
오른쪽으로 출발한다.
가장 헷갈리게 만든 점은
X 초 후에 방향을 90도 꺾는다는 정보였는데,
방향을 바꾸고 나서 그 다음 X 초 후에 꺾는다는 소린 줄 알고
삽질하다가,
게임 경과 시간이 X초 일 때 방향을 전환한다는 것이라는 것을
겁나 늦게 깨닫고 고쳤다. ㅋㅋ
여하튼 주의하자.
1. 위치는 (행, 열) 로 주어진다 = (y, x)로 생각하면 편함
2. 게임은 반드시 끝난다. (X는 10000까지 이므로 10000초가 넘어가면 언제든 벽에 머리 박고 죽는다)
3. 본인이 바라보는 방향 기준 왼쪽이 L 오른쪽이 D 이다. <- 방향을 보고 있다면 L 이면 아래쪽으로 가야한다.
참고로 처음 방향은 오른쪽이므로 방향은 (0, 1) 으로 잡았고
아래쪽으로 가는 것이 (1,0) 방향이다.
#include <stdio.h>
#define APPLE 1
int N, K, L;
int Map[101][101];
//아래부터 시계 방향으로 한 바퀴
int dy[] = { 0,1,0,-1 };
int dx[] = { 1, 0, -1 , 0 };
int dir = 0;
int Head, Tail;
typedef struct st {
int time;
char Dir;
}MOVE;
MOVE Move[101];
typedef struct s {
int y ,x;
}CO;
//
CO Snake[100 * 100 * 100 + 1];
int solve() {
Snake[Head].y = 1;
Snake[Head++].x = 1;
Map[1][1] = 1;
int time = 0;
int idx = 0;
while (1) {
int ny = Snake[Head-1].y + dy[dir];
int nx = Snake[Head-1].x + dx[dir];
time++;
//나가서 죽을 경우
if (ny > N || ny <= 0 || nx > N || nx <= 0) break;
//사과 냠냠 => 머리만 이동하고 꼬리는 그대로
if (Map[ny][nx] == APPLE) {
Map[ny][nx] = 0;
Snake[Head].y = ny;
Snake[Head++].x = nx;
Map[ny][nx] = 2;
}// 자신이랑 부딪힐 경우
else if (Map[ny][nx] == 2) {
break;
}//아무것도 없는 곳으로 이동 => 머리, 꼬리 한 칸씩 이동
else {
Map[ny][nx] = 2;
Snake[Head].y = ny;
Snake[Head++].x = nx;
Map[Snake[Tail].y][Snake[Tail].x] = 0;
Tail++;
}
//X초가 되었을 때 방향 전환
if (Move[idx].time == time) {
//현재 방향 기준 오른쪽으로 90도
if (Move[idx].Dir == 'D') {
dir++;
dir %= 4;
}//현재 방향 기준 왼쪽으로 90도
else {
dir--;
if (dir < 0) dir += 4;
}
idx++;
}
}
return time;
}
int main() {
scanf("%d", &N);
scanf("%d", &K);
for (int i = 0; i < K; i++) {
int y, x;
scanf("%d %d", &y, &x);
Map[y][x] = APPLE;
}
scanf("%d", &L);
for (int i = 0; i < L; i++) {
scanf("%d %c", &Move[i].time, &Move[i].Dir);
}
int ans =solve();
printf("%d", ans);
}
'알고리즘' 카테고리의 다른 글
SW Expert Academy 5653 줄기세포배양 - C++ (0) | 2023.02.25 |
---|---|
백준14003 가장 긴 증가하는 부분 수열5 - C++ (0) | 2023.02.24 |
백준2206 벽 부수고 이동하기 - C++ (0) | 2023.02.23 |
백준 19237 어른 상어 - C++ (0) | 2023.02.23 |
백준 19236 청소년 상어 - C++ (0) | 2023.02.22 |