알고리즘/백준

BOJ 3190 뱀 / C++

내이름은 킹햄찌 2022. 7. 26. 22:12

https://www.acmicpc.net/problem/3190

 

3190번: 뱀

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

www.acmicpc.net

 

백준 온라인저지 3190번 뱀문제입니다.

 

아이디어

시뮬레이션 문제인만큼 snake 클래스로 대부분의 로직을 처리했습니다. 큰 어려움은 없었고 풀이에 대한 설명은 주석을 통해 이해할 수 있을거라고 판단됩니다.

 

#include<iostream>
#include<queue>
#include<vector>

using namespace std;

enum {
	none = 0,
	apple = 1,
	snake = 2
};

class point {
public :
	int y;
	int x;
	int dirc;
	point(int a, int b, int c) {
		x = a;
		y = b;
		dirc = c;
	}
};

// 오른쪽, 아래, 왼쪽, 위
int mx[4] = { 1,0,-1,0 };
int my[4] = { 0,1,0,-1 };

vector<point> snakes;
vector<vector<int>> field;
queue<pair<int, char>> order;

int N, K, L, X;
char C;

vector<vector<int>> setField(int n) {
	return vector<vector<int>>(n+1, vector<int>(n+1, 0));
}

void input() {
	cin >> N;
	field = setField(N);
	cin >> K;
	int x, y;
	for(int i=0;i<K;i++){
		cin >> y >> x;
		field[x][y] = apple;
	}
	cin >> L;
	for(int i=0;i<L;i++){
		cin >> X;
		cin >> C;
		order.push({ X,C });
	}
}

void solution() {
	int time = 0;
	
	snakes.push_back(point(1, 1, 0));
	field[1][1] = snake;
	while (snakes.size()) {

		//방향이 바뀔때
		if (order.size() != 0 && time == order.front().first) {

			//오른쪽
			if (order.front().second == 'D') {
				snakes[0].dirc = snakes[0].dirc != 3 ? snakes[0].dirc + 1 : 0;
			}
			//왼쪽
			else {
				snakes[0].dirc = snakes[0].dirc != 0 ? snakes[0].dirc - 1 : 3;
			}
			order.pop();
		}

		time++;
		
		//뱀이 움직이는 로직
		
		point p = snakes[0];
		

		//벽에 머리를 박음
		if (p.x + mx[p.dirc] > N || p.x + mx[p.dirc] <= 0 || p.y + my[p.dirc] > N || p.y + my[p.dirc] <= 0) {
			cout << time;
			return;
		}

		//몸통에 머리를 박음
		if (field[p.x + mx[p.dirc]][p.y + my[p.dirc]] == snake) {
			cout << time;
			return;
		}

		//사과 먹을때
		if (field[p.x + mx[p.dirc]][p.y + my[p.dirc]] == apple) {
			field[p.x + mx[p.dirc]][p.y + my[p.dirc]] = snake;
			snakes.insert(snakes.begin(),point(p.x + mx[p.dirc], p.y + my[p.dirc], snakes[0].dirc));
			continue;
		}
		

		//지나갈수 있을때
		//몸통이 없다면
		if (snakes.size() == 1) {
			field[p.x][p.y] = none;
			field[p.x + mx[p.dirc]][p.y + my[p.dirc]] = snake;
			snakes.push_back(point(p.x + mx[p.dirc], p.y + my[p.dirc], snakes[0].dirc));
			snakes.erase(snakes.begin());
			
		}
		//몸통이 있다면
		else {
			field[p.x + mx[p.dirc]][p.y + my[p.dirc]] = snake;
			field[snakes[snakes.size()-1].x][snakes[snakes.size() - 1].y] = none;
			snakes.insert(snakes.begin(), point(p.x + mx[p.dirc], p.y + my[p.dirc], snakes[0].dirc));
			snakes.erase(snakes.end()-1);
		}
		
	}
}

int main(void) {
	input();
	solution();
}