728x90
https://www.acmicpc.net/problem/3190
어렸을 때 해봤던 뱀 게임 문제이다.
뱀은 매 초마다
1. 머리를 방향에 따라 이동한다
2. 머리에 사과가 있다면 뱀의 길이는 하나 늘어난다. 즉, 꼬리 부분이 그대로 있다.
3. 사과가 없다면 한 칸 전진한 것이므로 꼬리 부분 역시 한 칸 이동한다.
명령어는 L(왼쪽)과 D(오른쪽)으로 구성되어 있으며, 게임 시작 시간으로부터 X초가 끝난 뒤에 실행된다.
따라서 1초마다 뱀의 머리를 방향에 맞춰 이동해주었고, 사과의 유무에 따라 꼬리를 조절해주었다.
여기서 deque를 이용해서 이동 시 뱀의 머리에 해당하는 x, y를 push_front 해주었고, 꼬리는 pop_back 해주었다.
뱀의 좌표는 deque로 저장해주고, 자신의 몸에 부딪치는 경우는 check배열을 이용해서 확인했다.
그리고 x초에 해야 할 일을 모두 끝내고, 명령어에 x초 방향 전환이 있다면 방향을 바꿔주었다.
그러면 다음 x+1초부터 바뀐 방향으로 뱀의 머리가 이동한다.
즉, 뱀은 항상 머리만 방향 따라 움직이게 하고, 꼬리만 조절해주도록 구현하면 된다.
#include <iostream>
#include <vector>
#include <deque>
using namespace std;
int board[101][101], check[101][101], moveTo[4][2] = { {0, 1}, {1, 0}, {0, -1}, {-1, 0} };
int N, K, L, row, col, t;
char direction;
typedef pair<int, int> pii;
typedef pair<int, char> pic;
deque<pii> snake;
deque<pic> command;
int main() {
ios::sync_with_stdio(false);
cin.tie(0);
cin >> N >> K;
for (int k = 0; k < K; k++) {
cin >> row >> col;
board[row][col] = -1; // 사과
}
cin >> L;
for (int l = 0; l < L; l++) {
cin >> t >> direction;
command.push_back({ t, direction });
}
int x = 1, y = 1, d = 0, t = 0;
snake.push_back({ x,y });
check[x][y] = true;
while (!snake.empty()) {
t++; // 매초 증가
// 머리 이동
int nx = snake.front().first + moveTo[d][0];
int ny = snake.front().second + moveTo[d][1];
if (nx > N || ny > N || nx < 1 || ny < 1) { // 벽에 부딪치는 경우
cout << t;
break;
}
if (check[nx][ny]) { // 내 몸에 부딪치는 경우
cout << t;
break;
}
check[nx][ny] = true;
snake.push_front({ nx,ny });
if (board[nx][ny] == -1) { // 사과 발견
board[nx][ny] = 0; // 먹고 지워주기
}
else { // 사과 없으면 꼬리 줄이기
check[snake.back().first][snake.back().second] = false;
snake.pop_back();
}
if (!command.empty()) {
if (t == command.front().first) { // t초가 끝난 뒤에 회전하는 명령
if (command.front().second == 'L') { // 왼쪽
d = (d + 3) % 4;
}
else { // 오른쪽
d = (d + 1) % 4;
}
command.pop_front();
}
}
}
}
728x90
'문제 풀이 > 백준 알고리즘' 카테고리의 다른 글
[baekjoon 14719] 빗물 (구현, 스택) (C++) (0) | 2021.09.24 |
---|---|
[baekjoon 19951] 태상이의 훈련소 생활 (누적합) (C++) (0) | 2021.09.21 |
[baekjoon 2800] 괄호 제거 (스택, 구현, 재귀) (C++) (0) | 2021.09.20 |
[baekjoon 2696] 중앙값 구하기 (우선순위 큐) (C++) (2) | 2021.09.07 |
[baekjoon 12904] A와 B (문자열, 그리디) (C++) (0) | 2021.09.05 |