문제 주소 : www.acmicpc.net/problem/15685
15685번: 드래곤 커브
첫째 줄에 드래곤 커브의 개수 N(1 ≤ N ≤ 20)이 주어진다. 둘째 줄부터 N개의 줄에는 드래곤 커브의 정보가 주어진다. 드래곤 커브의 정보는 네 정수 x, y, d, g로 이루어져 있다. x와 y는 드래곤 커
www.acmicpc.net
문제 확인
간단한 시뮬레이션 문제입니다. 주어진대로 드래곤 커브 정보를 배열에 입력해둔 후 마지막에 정사각형 개수를 세면 됩니다.
풀이
드래곤 커브의 방향을 기록해야 다음 레벨의 드래곤 커브를 만들 수 있으므로 스택을 이용해서 기록합니다. 주의해야 할 점은 이전 단계 끝 지점에서 90도 방향으로 돌려야 하므로 스택에 저장된 정보를 top -> 0 순으로 읽어야 하며 모양이 90도 회전이므로 방향은 반시계 방향이 되어야 합니다.
* stack[top + 1] = (stack[top] + 1)%4, stack[top + 2] = (stack[top - 1] + 1)%4 ...
또한 드래곤 커브의 개수는 레벨에 따라 지정되며 2^level 개입니다. 이를 통해 스택에 방향을 저장해나갑니다.
코드
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
|
#include<cstdio>
int main() {
char a[101][101] = { 0 }, dy[] = { 1,0,-1,0 }, dx[] = { 0,-1,0,1 };//왼상오하
int n, c = 0;
scanf("%d", &n);
for (int i = 0, x, y, d, g; i < n; i++) {
scanf("%d%d%d%d", &y, &x, &d, &g);
a[x][y] = 1;
x += dx[d]; y += dy[d];
a[x][y] = 1;
char s[1024] = { d };
for (int t = 0, c = 1; t < g; t++, c <<= 1) {//c : 레벨에서 드래곤 커브 개수 0: 1개, 1: 2개, 2: 4개 ...
for (int j = 0; j < c; j++) {//c를 기준으로 대칭으로 기록
d = s[c + j] = (s[c - j - 1] + 1) % 4;//top -> 0 순으로, 90도 회전 = 반시계
x += dx[d]; y += dy[d];
a[x][y] = 1;//방문 표시
}
}
}
for (int i = 0; i < 100; i++) {
for (int j = 0; j < 100; j++) {
if (a[i][j] && a[i][j + 1] && a[i + 1][j] && a[i + 1][j + 1])//계산
c++;
}
}
printf("%d", c);
}
|
cs |
반응형
'알고리즘 문제 > [백준]' 카테고리의 다른 글
[백준] 1150 백업 (0) | 2020.12.19 |
---|---|
[백준] 8895 막대 배치 (0) | 2020.12.18 |
[백준] 2357 최솟값과 최댓값 (0) | 2020.12.17 |
[백준] 10868 최솟값 (0) | 2020.12.15 |
[백준] 1744 수 묶기 (0) | 2020.12.12 |