무민은귀여워

[알고스팟] 쿼드 트리 뒤집기 QUADTREE 본문

IT/알고리즘

[알고스팟] 쿼드 트리 뒤집기 QUADTREE

moomini 2019. 11. 19. 17:20
반응형

https://algospot.com/judge/problem/read/QUADTREE

 

algospot.com :: QUADTREE

쿼드 트리 뒤집기 문제 정보 문제 대량의 좌표 데이터를 메모리 안에 압축해 저장하기 위해 사용하는 여러 기법 중 쿼드 트리(quad tree)란 것이 있습니다. 주어진 공간을 항상 4개로 분할해 재귀적으로 표현하기 때문에 쿼드 트리라는 이름이 붙었는데, 이의 유명한 사용처 중 하나는 검은 색과 흰 색밖에 없는 흑백 그림을 압축해 표현하는 것입니다. 쿼드 트리는 2N × 2N 크기의 흑백 그림을 다음과 같은 과정을 거쳐 문자열로 압축합니다. 이 그림의 모든

algospot.com

 

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
#include <iostream>
#include <string>
 
using namespace std;
 
class Node
{
public:
    Node* parent;
 
    Node* firstChild;
    Node* secondChild;
    Node* thirdChild;
    Node* fourthChild;
 
    char data;
 
    Node(char ch)
    {
        data = ch;
 
        parent = NULL;
        firstChild = NULL;
        secondChild = NULL;
        thirdChild = NULL;
        fourthChild = NULL;
    }
 
};
 
Node* makeTree(string::iterator& it)
{
    char ch = *it;
    Node* n = new Node(ch);
 
    if (ch == 'x')
    {
        it++;
        n->firstChild = makeTree(it);
        it++;
        n->secondChild = makeTree(it);
        it++;
        n->thirdChild = makeTree(it);
        it++;
        n->fourthChild = makeTree(it);
 
    }
 
    return n;
}
 
void solve(Node* n)
{
    cout << n->data;
 
    if (n->firstChild != NULL)
    {
        Node* temp1 = n->firstChild;
        n->firstChild = n->thirdChild;
        n->thirdChild = temp1;
 
        Node* temp2 = n->secondChild;
        n->secondChild = n->fourthChild;
        n->fourthChild = temp2;
 
        solve(n->firstChild);
        solve(n->secondChild);
        solve(n->thirdChild);
        solve(n->fourthChild);
    }
}
 
int main()
{
    int count;
    cin >> count;
    while (count--)
    {
        string str;
        cin >> str;
 
        string::iterator it = str.begin();
        Node* start = makeTree(it);
        solve(start);
        cout << endl;
    }
 
    return 0;
}
cs
반응형
Comments