3190번: 뱀
'Dummy' 라는 도스게임이 있다. 이 게임에는 뱀이 나와서 기어다니는데, 사과를 먹으면 뱀 길이가 늘어난다. 뱀이 이리저리 기어다니다가 벽 또는 자기자신의 몸과 부딪히면 게임이 끝난다. 게임
www.acmicpc.net
삼성 기출문제를 풀기 시작하여 첫문제로 정한 구현문제이다.
처음엔 조건을 보고 약간 겁먹었는데
천천히 조건을 보고 각 칸을 뱀의 몸, 사과, 빈 공간, 벽으로 나누었고
뱀은 덱을 사용해 구현하였다.
또한 다음 위치를 항상 저장하고 방향변수 및 시간 변수를 사용해서 풀었고
방향 전환을 할때 현재 방향을 고려하여 방향을 바꿔주었다.
#define _CRT_SECURE_NO_WARINGS
#include <iostream>
#include <deque>
#include <vector>
#include <algorithm>
using namespace std;
int N, K, L, cnt; //기본 변수 3개, 시간변수
int dv, tv; //방향변수, 방향전환 벡터 위치변수
int map[102][102];
deque<pair<int, int>> snake;
vector <pair<int, char>> v;
int main() {
int a, b;
char c;
cin >> N;
cin >> K;
for (int i = 0; i < K; i++) {
cin >> a >> b;
map[a][b] = 1;
}
cin >> L;
for (int i = 0; i < L; i++) {
cin >> a >> c;
v.push_back({ a,c });
}
a = 1, b = 2;
snake.push_back({ 1, 1 }); //초기 뱀 세팅
map[1][1] = 3;
for (int i = 0; i <= N + 1; i++) { //초기 벽 세팅
map[0][i] = 2;
map[i][0] = 2;
map[i][N + 1] = 2;
map[N + 1][i] = 2;
}
while (1) {
snake.push_front({ a,b }); //뱀 머리 넣기
cnt++;
if (map[a][b] == 0) { //공간이 빈 경우
map[snake.front().first][snake.front().second] = 3;
map[snake.back().first][snake.back().second] = 0;
snake.pop_back();
}
else if (map[a][b] == 1) { //사과가 있는 경우
map[snake.front().first][snake.front().second] = 3;
}
else { //뱀의 몸이나 벽일 경우
break;
}
if (tv < v.size() && cnt == v[tv].first) { //방향전환
if (v[tv].second == 'L') { //왼쪽
if (dv == 0) {
dv = 3;
}
else {
dv -= 1;
}
}
else { //오른쪽
if (dv == 3) {
dv = 0;
}
else {
dv += 1;
}
}
tv++;
}
if (dv == 0) { //다음 칸 이동
b++;
}
else if (dv == 1) {
a++;
}
else if (dv == 2) {
b--;
}
else {
a--;
}
}
cout << cnt << "\n";
return 0;
}
'알고리즘 공부 > C++' 카테고리의 다른 글
[C++] 백준 16234번: 인구 이동 (0) | 2021.03.25 |
---|---|
[C++] 백준 14500번: 테트로미노 (0) | 2021.03.25 |
[C++] 백준 13458번: 시험 감독 (0) | 2021.03.17 |
[C++] 백준 1992번: 쿼드트리 (0) | 2020.11.30 |
[C++] 백준 2583번: 영역 구하기 (0) | 2020.11.30 |