알고리즘/백준
BOJ 3190 뱀 / C++
내이름은 킹햄찌
2022. 7. 26. 22:12
https://www.acmicpc.net/problem/3190
3190번: 뱀
'Dummy' 라는 도스게임이 있다. 이 게임에는 뱀이 나와서 기어다니는데, 사과를 먹으면 뱀 길이가 늘어난다. 뱀이 이리저리 기어다니다가 벽 또는 자기자신의 몸과 부딪히면 게임이 끝난다. 게임
www.acmicpc.net
백준 온라인저지 3190번 뱀문제입니다.
아이디어
시뮬레이션 문제인만큼 snake 클래스로 대부분의 로직을 처리했습니다. 큰 어려움은 없었고 풀이에 대한 설명은 주석을 통해 이해할 수 있을거라고 판단됩니다.
#include<iostream>
#include<queue>
#include<vector>
using namespace std;
enum {
none = 0,
apple = 1,
snake = 2
};
class point {
public :
int y;
int x;
int dirc;
point(int a, int b, int c) {
x = a;
y = b;
dirc = c;
}
};
// 오른쪽, 아래, 왼쪽, 위
int mx[4] = { 1,0,-1,0 };
int my[4] = { 0,1,0,-1 };
vector<point> snakes;
vector<vector<int>> field;
queue<pair<int, char>> order;
int N, K, L, X;
char C;
vector<vector<int>> setField(int n) {
return vector<vector<int>>(n+1, vector<int>(n+1, 0));
}
void input() {
cin >> N;
field = setField(N);
cin >> K;
int x, y;
for(int i=0;i<K;i++){
cin >> y >> x;
field[x][y] = apple;
}
cin >> L;
for(int i=0;i<L;i++){
cin >> X;
cin >> C;
order.push({ X,C });
}
}
void solution() {
int time = 0;
snakes.push_back(point(1, 1, 0));
field[1][1] = snake;
while (snakes.size()) {
//방향이 바뀔때
if (order.size() != 0 && time == order.front().first) {
//오른쪽
if (order.front().second == 'D') {
snakes[0].dirc = snakes[0].dirc != 3 ? snakes[0].dirc + 1 : 0;
}
//왼쪽
else {
snakes[0].dirc = snakes[0].dirc != 0 ? snakes[0].dirc - 1 : 3;
}
order.pop();
}
time++;
//뱀이 움직이는 로직
point p = snakes[0];
//벽에 머리를 박음
if (p.x + mx[p.dirc] > N || p.x + mx[p.dirc] <= 0 || p.y + my[p.dirc] > N || p.y + my[p.dirc] <= 0) {
cout << time;
return;
}
//몸통에 머리를 박음
if (field[p.x + mx[p.dirc]][p.y + my[p.dirc]] == snake) {
cout << time;
return;
}
//사과 먹을때
if (field[p.x + mx[p.dirc]][p.y + my[p.dirc]] == apple) {
field[p.x + mx[p.dirc]][p.y + my[p.dirc]] = snake;
snakes.insert(snakes.begin(),point(p.x + mx[p.dirc], p.y + my[p.dirc], snakes[0].dirc));
continue;
}
//지나갈수 있을때
//몸통이 없다면
if (snakes.size() == 1) {
field[p.x][p.y] = none;
field[p.x + mx[p.dirc]][p.y + my[p.dirc]] = snake;
snakes.push_back(point(p.x + mx[p.dirc], p.y + my[p.dirc], snakes[0].dirc));
snakes.erase(snakes.begin());
}
//몸통이 있다면
else {
field[p.x + mx[p.dirc]][p.y + my[p.dirc]] = snake;
field[snakes[snakes.size()-1].x][snakes[snakes.size() - 1].y] = none;
snakes.insert(snakes.begin(), point(p.x + mx[p.dirc], p.y + my[p.dirc], snakes[0].dirc));
snakes.erase(snakes.end()-1);
}
}
}
int main(void) {
input();
solution();
}