문제 링크: https://www.acmicpc.net/problem/3190
뱀 게임이라고 아실겁니다. 되게 고전 게임인데 이 문제는 그 게임을 구현하는 문제입니다.
저는 군대 특기학교 있을때 자바스크립트로 이 게임 만들어서 하고 그랬습니다.. 암튼 원리는 다들 아실 겁니다.
금방 풀 줄 알았는데 여러번 틀렸습니다;;;
처음에 틀린 이유는 사과를 먹었을 때 없어지게 하지 않아서 틀렸고요, 두 번째는 좌회전, 우회전 구현을 좀 잘못해놓은 실수가 있었네요.
알고리즘적으로 어려운것은 전혀 없는 그냥 구현 문제입니다
#define _CRT_SECURE_NO_WARNINGS
#include <bits/stdc++.h>
using namespace std;
// 시계방향
enum DIRECTION {
RIGHT,
DOWN,
LEFT,
UP
};
enum MAP {
EMPTY,
APPLE,
//SNAKE
};
const int dir[][2] = { {0, 1}, {1, 0}, {0, -1}, {-1, 0} }; //y, x
int arr[100][100];
int current_direction = DIRECTION::RIGHT;
int elapsed = 0;
bool endflag = false;
int main(int argc, char** argv)
{
#ifndef ONLINE_JUDGE
freopen("input.txt", "r", stdin);
#endif
ios_base::sync_with_stdio(false);
cin.tie(NULL);
int n, k, l;
cin >> n >> k;
int a, b;
for (int i = 0; i < k; ++i) {
cin >> a >> b;
arr[a - 1][b - 1] = MAP::APPLE;
}
cin >> l;
vector<pair<int, bool>> turns; //sec, is_clockwise
turns.reserve(l);
char c;
for (int i = 0; i < l; ++i) {
cin >> a >> c;
turns.push_back(make_pair(a, c=='D'));
}
deque<pair<int, int>> snake; //front 머리 back 꼬리, y, x
snake.push_back(make_pair(0, 0));
while (true) {
if (endflag) break;
++elapsed;
// move
pair<int, int> next_move = snake.front();
next_move.first += dir[current_direction][0];
next_move.second += dir[current_direction][1];
snake.push_front(next_move);
// wall?
if (!(next_move.first >= 0 && next_move.first < n && next_move.second >= 0 && next_move.second < n)) {
break;
}
// snake body check
for (int i = 1; i < snake.size(); ++i) {
if (snake[i] == next_move) {
endflag = true;
break;
}
}
// empty
if (arr[next_move.first][next_move.second] != MAP::APPLE) {
snake.pop_back();
}
else {
// 사과 먹은거 처리
arr[next_move.first][next_move.second] = MAP::EMPTY;
}
// turn
for (auto& t : turns) {
if (t.first == elapsed) {
if (t.second)
current_direction = (current_direction + 1) % 4;
else
current_direction = (current_direction == 0 ? 3 : current_direction - 1);
}
}
}
cout << elapsed;
return 0;
}
반응형
'Online Judge > 백준' 카테고리의 다른 글
[백준][C++] 15685: 드래곤 커브 (0) | 2020.03.28 |
---|---|
[백준][C++] 14500: 테트로미노 (0) | 2020.03.26 |
[백준][C++] 2615: 오목 (2) | 2020.03.26 |
[백준][C++] 1939: 중량제한 (0) | 2020.03.26 |
[백준][C++] 2312: 수 복원하기 (0) | 2019.08.22 |