득이공간

[백준 C++] 3190 뱀 - 덱 본문

PS/알고리즘 문제풀이

[백준 C++] 3190 뱀 - 덱

쟁득 2024. 4. 21. 21:43

 

3190번: 뱀

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

www.acmicpc.net


 

문제풀이

 

덱 자료구조를 이용해서 뱀 몸의 위치를 기록하는 방법으로 푸는 시뮬레이션 유형의 문제입니다.

각 초마다 문제에서 제시한 조건대로 이동을 구현해주어 풀었습니다.

 

덱에 push_back으로 머리 이동 위치를 저장해주었고, 사과를 먹지 않았을 때는 pop_front로 꼬리를 이동해주었습니다.

그리고 초가 끝났을 때는 입력받은 X, C 정보에 따라 뱀이 현재 향하고 있는 방향(0:L, 1:R, 2:T, 3:B)을 나타내는 변수를 바꿔주었습니다.


코드

#include <iostream>
#include <deque>
using namespace std;

typedef pair<int, int> p;

const int DX[4] = { -1, 0, 1, 0 };
const int DY[4] = { 0, -1, 0, 1 };

int N, K, L;
int Map[100][100];
p Change[100];
deque<p> Snake;

int main()
{
	ios::sync_with_stdio(false);
	cin.tie(nullptr); cout.tie(nullptr);

	cin >> N >> K;
	for (int i = 0; i < K; ++i)
	{
		int R, C;
		cin >> R >> C;
		Map[R - 1][C - 1] = 2;
	}

	cin >> L;
	for (int i = 0; i < L; ++i)
	{
		int X;
		char C;
		cin >> X >> C;
		Change[i].first = X;
		Change[i].second = (C == 'L') ? -1 : 1;
	}

	Snake.push_back(p(0, 0));
	int Time = 0, Li = 0, Di = 2;
	while (true)
	{
		++Time;

		int R = Snake.back().first;
		int C = Snake.back().second;

		int NR = R + DY[Di];
		int NC = C + DX[Di];
		if (NR < 0 || NR > N - 1 || NC < 0 || NC > N - 1 || Map[NR][NC] == 1)
		{
			break;
		}

		if (Map[NR][NC] != 2)
		{
			int FR = Snake.front().first;
			int FC = Snake.front().second;
			Snake.pop_front();
			Map[FR][FC] = 0;
		}

		Map[NR][NC] = 1;
		Snake.push_back(p(NR, NC));

		if (Li != L && Time == Change[Li].first)
		{
			int ND = Di + Change[Li].second;
			Di = (ND < 0) ? 3 : ((ND > 3) ? 0 : ND);
			++Li;
		}
	}

	cout << Time;
}