알고리즘
BOJ 3190: 뱀
minbear
2023. 5. 4. 02:33
#BOJ 3190: 뱀
3190번: 뱀
'Dummy' 라는 도스게임이 있다. 이 게임에는 뱀이 나와서 기어다니는데, 사과를 먹으면 뱀 길이가 늘어난다. 뱀이 이리저리 기어다니다가 벽 또는 자기자신의 몸과 부딪히면 게임이 끝난다. 게임
www.acmicpc.net
#풀이
1. 뱀은 사과를 먹으면 몸의 길이가 증가함
2. 뱀은 오른쪽,왼쪽으로 90도 방향 회전이 가능함
3. 뱀은 정사각형을 나가거나 자신의 몸에 닿으면 게임이 끝남
이 조건을 해결하면 풀 수 있는 문제이다. 근데 이거 문제가 너무 정보가 부족하게 나온다.
내가 이게임을 제대로 안해봐서 그런가...??
정사각형 외곽에 벽이 있다고 했는데 이게 정사각형을 나갔을 때 인지 아니면 그냥 배열의 외곽에 위치하면 끝나는 건지 헷갈렸다. 이유는 나갔을 때와 외곽에 위치할 때 답의 차이가 1 있기 때문이다.....
또한 뱀이 사과가 없는 칸을 이동 했을 때 뱀의 머리가 이동하면서 vector맨 앞 요소에 추가를 하고 맨 마지막 원소를 제거 하면 뱀의 이동을 나타낼 수 있는데 조건 3에 자신의 몸에 닿으면 게임이 끝난다고 되어있다... 사과를 먹지 않는 이상 뱀의 크기가 늘어나지 않으므로 이동을 하면 머리와 꼬리가 동시에 앞으로 가므로 닿을 수 없다고 생각했는데 예제 3번을 보면서 뱀의 머리가 먼저 이동하고 이동 했을 때 꼬리가 닿으면 게임이 끝나야 예제 3번의 답이 나올 수 있었다....
간단하게 구현할 수 있다.
#코드
#include<iostream> // #include<bits/stdc++.h>
#include<queue>
using namespace std;
int board[100][100];
int n, k, l;
int location = 1; // 0 상, 1 우, 2,하, 3좌
vector<pair<int, int>> v; // 뱀
queue<pair<int, char>> Q;
int ans;
void func() {
v.push_back({ 0, 0 });
while (true) {
auto a = v[0];
if (!Q.empty())
{
auto b = Q.front();
if (b.first == ans) {
Q.pop();
if (b.second == 'D') { // 오른쪽 90도
location = location == 3 ? 0 : location + 1;
}
if(b.second =='L') { // 왼쪽 90 도
location = location == 0 ? 3 : location - 1;
}
}
}
int x = 0;
int y = 0;
if (location == 0) { // 방향전환
x = a.first - 1;
y = a.second;
}
else if (location == 1) {
x = a.first;
y = a.second + 1;
}
else if (location == 2) {
x = a.first + 1;
y = a.second;
}
else {
x = a.first;
y = a.second - 1;
}
if (x < 0 || y < 0 || x >= n || y >= n) {
ans++;
return;
}
v.insert(v.begin(), { x, y });
ans++;
for (int i = 0; i < v.size() - 1; i++) { // 뱀머리가 몸에 닿았느지 확인
for (int j = i + 1; j < v.size(); j++) {
if (v[i] == v[j]) {
return;
}
}
}
if (board[x][y] != 2) // 뱀 이동
v.erase(v.end() - 1);
else {
board[x][y] = 0;
}
}
}
int main() {
ios::sync_with_stdio(0);
cin.tie(0);
cin >> n >> k;
for (int i = 0; i < k; i++) {
int x, y;
cin >> x >> y;
board[x-1][y-1] = 2;
}
cin >> l;
for (int i = 0; i < l; i++) {
int s;
char c;
cin >> s >> c;
Q.push({ s, c });
}
func();
cout << ans << '\n';
return 0;
}