문제링크 :https://www.acmicpc.net/problem/15685

 

15685번: 드래곤 커브

첫째 줄에 드래곤 커브의 개수 N(1 ≤ N ≤ 20)이 주어진다. 둘째 줄부터 N개의 줄에는 드래곤 커브의 정보가 주어진다. 드래곤 커브의 정보는 네 정수 x, y, d, g로 이루어져 있다. x와 y는 드래곤 커�

www.acmicpc.net

 

 

 문제설명 

 

1. 첫째 줄에 드래곤 커브의 개수 N이 주어지고,  둘째 줄부터 N개의 줄에는 드래곤 커브의 정보가 주어진다.

2. 드래곤 커브의 정보는 네 정수 x, y, d, g로 이루어져 있다.

  (x와 y는 드래곤 커브의 시작 점, d는 시작 방향, g는 세대이다.)

3. 첫째 줄에 크기가 1×1인 정사각형의 네 꼭짓점이 모두 드래곤 커브의 일부인 것의 개수를 출력한다.

 

 알고리즘 

 

1. 처음 주는 방향이 0이라고 한다면 그다음세대는 0 1 이고 그다음 세대는 0 1 2 1이다.

 

0세대 0

1세대 0 1

2세대 0 1 2 1

3세대 0 1 2 1 2 3 2 1

4세대 0 1 2 1 2 3 2 1 2 3 0 3 2 3 2 1

 

위 규칙을 이용하여 드래곤 커브를 그리고 정사가각형의 네 꼭짓점이 모두 드래곤 커브인 것을 찾아내면 된다.

 

 코드 

 

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
#include<iostream>
#include<vector>
using namespace std;
 
int map[101][101];
vector<int> v;
 
 
void func(int y, int x, int d, int g) {
    map[y][x] = 1;
 
    //0세대
    v.push_back(d);
 
    //배열 만들기
    for (int i = 0; i < g; i++) {
        int Size = v.size();
        vector<int> ex;
 
        for (int j = Size - 1; j >= 0; j--) {
 
            if (v[j] + 1 > 3) ex.push_back(0);
            else
                ex.push_back(v[j] + 1);
        }
 
        for (int j = 0; j < Size; j++) {
            v.push_back(ex[j]);
        }
 
    }
    int Size = v.size();
    int yy = y, xx = x;
 
    //드래곤 커브 그리기
    for (int i = 0; i < Size; i++) {
        if (v[i] == 0) {
            xx++;
        }
        else if (v[i] == 1) {
            yy--;
 
        }
        else if (v[i] == 2) {
            xx--;
        }
 
        else if (v[i] == 3) {
            yy++;
        }
        map[yy][xx] = 1;
    }
 
 
    for (int i = 0; i < Size; i++)v.pop_back();
}
 
//사각형 확인 함수
int square() {
    int result = 0;
    for (int i = 0; i < 100; i++) {
        for (int j = 0; j < 100; j++) {
            if (map[i][j] && map[i + 1][j] && map[i][j + 1&& map[i + 1][j + 1])result++;
        }
    }
    return result;
}
 
int main() {
    int N;
    cin >> N;
    for (int i = 0; i < N; i++) {
        int x, y, d, g;
 
        cin >> x >> y >> d >> g;
        func(y, x, d, g);
 
    }
 
 
    cout << square();
}
 
cs

'c++ > 백준' 카테고리의 다른 글

백준 14891번: 톱니바퀴  (0) 2020.06.12
백준 15661번 : 링크와 스타트  (0) 2020.06.12
백준 12886번: 돌 그룹  (0) 2020.06.12
백준 14890번: 경사로  (0) 2020.06.12
백준 16922번 : 로마 숫자 만들기  (0) 2020.06.03
ariz1623