본문 바로가기
알고리즘 모음집/New 알고리즘

by KyeongMin 2020. 10. 13.
728x90
반응형

www.acmicpc.net/problem/3190

 

3190번: 뱀

 'Dummy' 라는 도스게임이 있다. 이 게임에는 뱀이 나와서 기어다니는데, 사과를 먹으면 뱀 길이가 늘어난다. 뱀이 이리저리 기어다니다가 벽 또는 자기자신의 몸과 부딪히면 게임이 끝난다. 게임

www.acmicpc.net

#include<stdio.h>
#include<iostream>
#include<vector>
#include<string.h>
#include<vector>
using namespace std;
#define NS 101//배열의 최대 크기
int N, K, L;//배열크기, 사과 개수, 경로개수
int ret;//결과값
int map[NS][NS];//뱀의 경로 배열
int dy[] = { 0,1,0,-1 };
int dx[] = { 1,0,-1,0 };
void init_input() {//초기화 및 초기 입력
	//초기화 
	N = K = L = 0;
	ret = 0;
	memset(map, 0, sizeof(map));
	//초기 입력
	scanf("%d %d",&N, &K);
	for (int k = 0; k < K; k++) {//사과 위치 
		int y, x;
		scanf("%d %d",&y, &x);
		map[y][x] = -1;//사과 저장
	}
}
bool safe(int y, int x) {//범위
	return 1 <= y && y <= N && 1 <= x && x <= N;
}
void gameStart() {
	int y = 1, x = 1, dir = 0, size = 1, tail = 1;//뱀의 상태
	scanf("%d", &L);
	for (int l = 0; l < L; l++) {
		int X; char C;//게임시작 시간으로 부터 X초, 방향 C-> D오른쪽,L왼쪽
		scanf("%d %c", &X, &C);
		while(1) {//시뮬 시작
			if (ret == X) {//방향 전환하는곳
				if (C == 'D') {//오른쪽 방향 전환
					dir = (++dir) % 4;
				}
				else if(C == 'L') {//왼쪽 방향 전환
					dir = (4+(--dir)) % 4;
				}
				if(l!=L-1)
				break;
			}
			//1. 먼저 뱀은 몸길이를 늘려 머리를 다음칸에 위치시킨다.

			int ny = y + dy[dir]; int nx = x + dx[dir];
			if (!safe(ny,nx)||(map[ny][nx]!=0&&map[ny][nx] >= tail-1&&size!=1)) {//꼬리에 닿는 경우 나 나가는 경우
				if (l != L - 1) {//남은 경로 없애기
					for (l++; l < L; l++) {
						scanf("%d %c", &X, &C);
					}
				}
				break;
			}

			//2. 만약 이동한 칸에 사과가 있다면, 그 칸에 있던 사과가 없어지고 꼬리는 움직이지 않는다.
			if (map[ny][nx] == -1) {
				map[ny][nx] = ++ret;//사과 먹고
				size++;
			}
			//3. 만약 이동한 칸에 사과가 없다면, 몸길이를 줄여서 꼬리가 위치한 칸을 비워준다.즉, 몸길이는 변하지 않는다.
			else if (map[ny][nx] != -1) {
				map[ny][nx] = ++ret;
				tail++;//꼬리칸 비워주기
			}
			y = ny; x = nx;
		}
	}
}
int main(void) {
	int T = 1;//테스트 케이스 개수
	//scanf("%d", &T);
	for (int tc = 1; tc <= T; tc++) {
		init_input();//초기화 및 초기 입력
		gameStart();//게임 시작
		//출력
		printf("%d\n", ret+1);
		//printf("#%d %d\n", tc, ret+1);
	}
	return 0;
}

꼬리 부분만 잘체크를 하면 쉬운 문제입니다.

728x90
반응형

'알고리즘 모음집 > New 알고리즘' 카테고리의 다른 글

치킨 배달  (0) 2020.10.13
아기상어  (0) 2020.10.13
드래곤 커브  (0) 2020.10.13
연구소 2  (0) 2020.10.12
원판 돌리기  (0) 2020.10.12

댓글