Algorithm 문제
[백준] 3190 - 뱀
노예2
2019. 6. 30. 16:55
https://www.acmicpc.net/problem/3190
3190번: 뱀
문제 'Dummy' 라는 도스게임이 있다. 이 게임에는 뱀이 나와서 기어다니는데, 사과를 먹으면 뱀 길이가 늘어난다. 뱀이 이리저리 기어다니다가 벽 또는 자기자신의 몸과 부딪히면 게임이 끝난다. 게임은 NxN 정사각 보드위에서 진행되고, 몇몇 칸에는 사과가 놓여져 있다. 보드의 상하좌우 끝에 벽이 있다. 게임이 시작할때 뱀은 맨위 맨좌측에 위치하고 뱀의 길이는 1 이다. 뱀은 처음에 오른쪽을 향한다. 뱀은 매 초마다 이동을 하는데 다음과 같은 규칙을 따
www.acmicpc.net
간단한 구현 문제. 문제 내에 뱀의 이동, 길이 증가에 대한 알고리즘이 잘 설명되어 있어 그대로 구현하면 된다.
n x n 배열에 사과를 1, 뱀을 2로 표현하고 뱀의 몸을 queue에 저장하여 먼저 지나간 위치의 값을 0으로 초기화하며 이동한다.
<C++ 코드>
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 | #include <cstdio> #include <vector> #include <queue> using namespace std; int arr[101][101]; int dx[4] = {1, 0, -1, 0}, dy[4] = {0, 1, 0, -1}; int main(){ int n, k, l; vector<pair<int, char> > v; queue<pair<int, int> > snake; scanf("%d %d", &n, &k); for(int i=0; i<k; i++){ int a, b; scanf("%d %d", &a, &b); arr[a][b] = 1; } scanf("%d", &l); for(int i=0; i<l; i++){ int x; char c; scanf("%d %c", &x, &c); v.push_back(make_pair(x, c)); } int re=0, cmd=0, dir=0; pair<int, int> head = make_pair(1, 1); snake.push(head); arr[head.second][head.first] = 2; while(true){ int x = head.first, y = head.second; // 전진 및 충돌 확인 x += dx[dir]; y += dy[dir]; head = make_pair(x, y); snake.push(head); if(x < 1 || x > n || y < 1 || y > n || arr[y][x]==2){ break; } // 사과 확인 및 축소 if(!arr[y][x]==1){ int rx = snake.front().first, ry = snake.front().second; arr[ry][rx] = 0; snake.pop(); } arr[y][x] = 2; // 시간 증가 및 방향 수정 re++; if(cmd < v.size() && re == v[cmd].first){ if(v[cmd].second == 'D'){ dir++; } else if(v[cmd].second == 'L'){ dir--; } dir = (dir + 4) % 4; cmd++; } } printf("%d", re+1); return 0; } | cs |