득이공간
[백준 C++] 3190 뱀 - 덱 본문
문제풀이
덱 자료구조를 이용해서 뱀 몸의 위치를 기록하는 방법으로 푸는 시뮬레이션 유형의 문제입니다.
각 초마다 문제에서 제시한 조건대로 이동을 구현해주어 풀었습니다.
덱에 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;
}
'PS > 알고리즘 문제풀이' 카테고리의 다른 글
[백준 C++] 16234 인구 이동 - 너비우선탐색 (1) | 2024.04.24 |
---|---|
[백준 C++] 1068 트리 - 깊이우선탐색 (0) | 2024.04.23 |
[백준 C++] 16566 카드 게임 - 분리집합 (1) | 2024.04.19 |
[백준 C++] 2887 행성 터널 - 최소신장트리 (0) | 2024.04.18 |
[백준 C++] 2565 전깃줄 - 다이나믹프로그래밍 (0) | 2024.04.17 |