백준3190 뱀 – C++


아케이드의 고전적인 뱀 게임입니다.

사과를 먹으면 뱀이 더 길어진다.

벽이나 자신에게 부딪히면 죽습니다.

게임이 끝나는 데 몇 초(몇 번) 걸립니까?

문제는 뱀의 초기 위치(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);
}