BOJ : https://www.acmicpc.net/problem/1992
1992번: 쿼드트리
첫째 줄에는 영상의 크기를 나타내는 숫자 N 이 주어진다. N 은 언제나 2의 제곱수로 주어지며, 1≤N ≤64의 범위를 가진다. 두 번째 줄부터는 길이 N 의 문자열이 N 개 들어온다. 각 문자열은 0 또는 1의 숫자로 이루어져 있으며, 영상의 각 점들을 나타낸다.
www.acmicpc.net
문제 해결을 위한 알고리즘 : 분할정복, 재귀
문제 난이도 : 최최하
구간마다 반복문을 통해 통일되었는지 안되었는지 확인하고
안되었으면 ( 입력후에
간단하게 재귀로 구간을 나눠서 호출해주고
재귀가 끝나는 곳에 ) 을 작성해주면 된다.
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
|
#include <cstdio>
#include <string>
using namespace std;
int arr[65][65];
string s;
int index;
int cnt;
void quad(int size, int y, int x) {
bool check = true;
int start = arr[y][x];
for (int i = y; i < y + size; i++) {
for (int j = x; j < x + size; j++) {
if (start != arr[i][j]) {
check = false;
break;
}
}
if (check == false) break;
}
if (check == true) {
if (start == 1)
s.insert(index++, "1");
else
s.insert(index++, "0");
}
else {
s.insert(index++, "("); cnt++;
quad(size / 2, y, x);
quad(size / 2, y, x + size / 2);
quad(size / 2, y + size / 2, x);
quad(size / 2, y + size / 2, x + size / 2);
if (cnt > 0) cnt--, s.insert(index++, ")");
}
}
int main() {
int N;
scanf("%d", &N);
for (int i = 1; i <= N; i++) {
for (int j = 1; j <= N; j++) {
scanf("%1d", &arr[i][j]);
}
}
quad(N, 1, 1);
for (int i = 0; i < s.size(); i++)
printf("%c", s[i]);
}
http://colorscripter.com/info#e" target="_blank" style="color:#4f4f4f; text-decoration:none">Colored by Color Scripter
|
'algorithm > BOJ' 카테고리의 다른 글
BOJ 11729번 하노이 탑 이동 순서 (0) | 2019.05.31 |
---|---|
백준 1780번 : 종이의 개수 - Junnnho (0) | 2019.05.30 |
백준 1011번 : Fly me to the Alpha Centauri - Junnnho (0) | 2019.05.19 |
백준 2529번 : 부등호 Junnnho (0) | 2019.05.17 |
BOJ 2252번 줄세우기 (0) | 2019.05.17 |