아케이드의 고전적인 뱀 게임입니다.
사과를 먹으면 뱀이 더 길어진다.
벽이나 자신에게 부딪히면 죽습니다.
게임이 끝나는 데 몇 초(몇 번) 걸립니까?
문제는 뱀의 초기 위치(1,1)에서 시작되며,
바로 시작
나를 가장 혼란스럽게 하는 것은
X초가 지나면 90도 회전한다는 정보였는데,
방향이 바뀌었다가 X초 후에 역전될 줄 알았는데
파는 동안
경과 시간이 X초가 되면 게임의 방향이 바뀝니다.
너무 늦게 인식하고 수정했습니다.
그래도 조심하세요.
1. Position은 (row,column)으로 주어진다 = (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);
}