알고리즘

백준3190 뱀 - C++

머리큰개발자 2023. 2. 24. 22:11

오락실에 있는 고전 뱀 게임이다.

사과 먹으면 뱀 길이가 길어지는데 

벽이나 자신의 몸에 부딪히면 죽는다.

 

게임이 총 몇 초(몇 회)만에 끝나는지 구하면 된다.

 

이 문제는 뱀의 처음 위치(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);
}