득이공간

[백준 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)을 나타내는 변수를 바꿔주었습니다.


코드

cpp
#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; }