알고리즘 문제/[백준]

[백준] 15685 드래곤 커브

latter2005 2020. 12. 17. 21:13

문제 주소 : 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