반응형
문제 링크: https://www.acmicpc.net/problem/15685
15685번: 드래곤 커브
첫째 줄에 드래곤 커브의 개수 N(1 ≤ N ≤ 20)이 주어진다. 둘째 줄부터 N개의 줄에는 드래곤 커브의 정보가 주어진다. 드래곤 커브의 정보는 네 정수 x, y, d, g로 이루어져 있다. x와 y는 드래곤 커
www.acmicpc.net
<문제 풀이> 시뮬레이션
다음 세대의 드래건 커브를 구하는 방법은 이전 세대의 드래곤 커브가 지나온 방향을 역순으로 시계 방향으로 90도 회전해서 끝점부터 다시 가면 됩니다.
시계 방향으로 90도 회전하는 방법은 아래와 같습니다.
if(방향 값 d == 3) d = 0
else d++
<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
|
#include<iostream>
#include<vector>
using namespace std;
int N;
int board[101][101];
vector<int> trace;
const int dx[4] = {1, 0, -1, 0};
const int dy[4] = {0, -1, 0, 1};
void getCurve(int x, int y, int d, int g) {
trace.push_back(d);
board[y + dy[d]][x + dx[d]] = 1;
y = y + dy[d];
x = x + dx[d];
while (g > 0) {
int trace_size = trace.size();
for (int i = trace_size - 1; i >= 0; i--) {
if (trace[i] == 0) d = 1;
else if (trace[i] == 1) d = 2;
else if (trace[i] == 2) d = 3;
else if (trace[i] == 3) d = 0;
board[y + dy[d]][x + dx[d]] = 1;
trace.push_back(d);
y = y + dy[d];
x = x + dx[d];
}
g--;
}
trace.clear();
};
int solve() {
int ret = 0;
for (int y = 0; y < 100; y++) {
for (int x = 0; x < 100; x++) {
if (board[y][x] == 1 && board[y + 1][x] == 1 && board[y][x + 1] == 1 && board[y + 1][x + 1]) ret++;
}
}
return ret;
}
int main(void) {
cin >> N;
for (int i = 0; i < N; i++) {
int x, y, d, g;
cin >> x >>y >> d >> g;
board[y][x] = 1;
getCurve(x, y, d, g);
}
cout << solve();
return 0;
}
|
cs |
반응형
'알고리즘 문제풀이 > 백준' 카테고리의 다른 글
[백준 17142번] 연구소 3 (0) | 2022.03.30 |
---|---|
[백준 20055번] 컨베이어 벨트 위의 로봇 (0) | 2022.03.26 |
[백준 14890번] 경사로 (0) | 2022.03.16 |
[백준 3055번] 탈출 (0) | 2022.03.13 |
[백준 16946번] 벽 부수고 이동하기 4 (0) | 2022.03.11 |