반응형
https://www.acmicpc.net/problem/3190
본 문제는 'Dummy'라는 도스 게임이 있다. 이 게임에는 뱀이 나와서 기어 다니는데, 사과를 먹으면 뱀 길이가 늘어난다. 뱀이 이리저리 기어 다니다가 벽 또는 자기 자신의 몸과 부딪히면 게임이 끝난다. 좀 더 자세한 설명은 링크를 참고하길 바란다.
뱀을 머리와 꼬리를 진짜로 움직이기는 까다롭다. 그래서 뱀을 이동한 시간과 뱀의 길이를 이용하여 문제를 해결할 수 있다.
- 방문한 칸에 사과가 있으면 뱀의 길이 증가
- 방문한 칸이 처음일 경우 이동
- 방문한 칸이 처음이 아닌데 시간의 차이가 뱀의 길이보다 클 경우 이동
- 아닐 경우 종료
- 뱀이 경지장 밖으로 나갈 경우 종료
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
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
|
#include <cstdio>
#include <queue>
#include <tuple>
using namespace std;
int map[101][101] = {0};
int apple[101][101];
int dx[] = {0, 1, 0, -1};
int dy[] = {1, 0, -1, 0};
char turn[101];
int main() {
int n, m, l, baam = 1;
// 보드 크기
scanf("%d", &n);
// 사과 개수 및 위치
scanf("%d", &m);
for (int i = 0; i < m; i++) {
int x, y;
scanf("%d %d", &x, &y);
// 위치가 (1, 1) 시작이므로 사과 위치 조정
x -= 1;
y -= 1;
apple[x][y] = 1;
}
// 방향 전환
scanf("%d", &l);
for (int i = 0; i < l; i++) {
int t;
char how;
scanf("%d %c", &t, &how);
turn[t] = how;
}
queue<tuple<int, int, int, int>> q;
q.push(make_tuple(0, 0, 0, 0));
map[0][0] = 0;
while (!q.empty()) {
int x, y, k, cnt;
tie(x, y, k, cnt) = q.front();
q.pop();
// printf("====================\n");
// for (int i = 0; i < n; i++) {
// for (int j = 0; j < n; j++) {
// printf("%d ", map[i][j]);
// }
// printf("\n");
// }
// 왼쪽으로 90도 회전
if (turn[cnt] == 'L') {
k -= 1;
if (k < 0) k = 3;
}
// 오른쪽으로 90도 회전
if (turn[cnt] == 'D') {
k += 1;
if (k > 3) k = 0;
}
int nx = x + dx[k];
int ny = y + dy[k];
cnt += 1;
// 경지장 밖일 경우
if (nx < 0 || nx >= n || ny < 0 || ny >= n) {
printf("%d\n", cnt);
return 0;
}
else {
// 사과일 경우
if (apple[nx][ny] == 1) {
baam += 1;
apple[nx][ny] = 0;
}
// 처음 방문
if (map[nx][ny] == 0) {
map[nx][ny] = cnt;
q.push(make_tuple(nx, ny, k, cnt));
}
else {
// 뱀의 길이가 시간 차 보다 길거나 같을 경우
if (cnt - map[nx][ny] <= baam) {
printf("%d\n", cnt);
return 0;
}
else {
map[nx][ny] = cnt;
q.push(make_tuple(nx, ny, k, cnt));
}
}
}
}
}
|
cs |
반응형
'백준' 카테고리의 다른 글
[백준 15685] 드래곤 커브, C++ (0) | 2020.05.16 |
---|---|
[백준 14499] 주사위 굴리기, C++ (0) | 2020.05.11 |
[백준 14888] 연산자 끼워넣기, C++ (0) | 2020.05.03 |
[백준 12872] 플레이리스트, C++ (0) | 2020.04.27 |
[백준 2916] 자와 각도기, C++ (1) | 2020.04.27 |
댓글