Notice
Recent Posts
Recent Comments
Link
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
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 |
Tags
- 재귀
- DFS
- union-find
- Algospot
- 분할정복
- 누적합
- 완전탐색
- priority_queue
- backtracking
- 다이나믹프로그래밍
- 세그먼트트리
- BOJ
- acm
- 분리집합
- Greedy
- 그리디
- 알고스팟
- 문자열
- 알고리즘문제해결전략
- 유니온파인드
- 이분탐색
- 백준
- 스택
- stack
- 종만북
- BFS
- 너비우선탐색
- 동적계획법
- DP
- 백트래킹
Archives
- Today
- Total
DAMPER's blog
1992 쿼드트리 본문
728x90
<아이디어>
알고리즘 문제해결전략 책에 소개된 알고스팟 문제와 유사한 문제이다.
전형적인 분할정복 문제.
문제를 4부분으로 쪼갠 후 (좌상 우상 좌하 우하), 각 부분을 모두 0이거나 1일때까지 계속해서 4부분으로 쪼갠다.
모두 0이거나 1인 부분이 나오면 (또는 나눈 부분의 크기가 1인 부분) 그대로 해당 문자를 return 한다.
return을 받았다면 4부분을 합쳐서 다시 return 한다.
최종적으로 return 한 문자열을 출력하면 끝.
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
|
#include <bits/stdc++.h>
using namespace std;
#define swap(a,b) (a)^=(b)^=(a)^=(b)
#define endl '\n'
typedef long long lld;
string div_s(vector<string>& v, int size, int y, int x)
{
bool flag = true;
for(int i=y;i<y+size;i++)
for(int j=x;j<x+size;j++)
if(v[i][j]!=v[y][x]) flag = false;
if(flag) return string(1, v[y][x]);
size /= 2;
return "("+div_s(v, size, y, x)+div_s(v, size, y, x+size)+
div_s(v, size, y+size, x)+div_s(v, size, y+size, x+size)+")";
}
int main()
{
ios_base::sync_with_stdio(NULL);
cin.tie(NULL);
cout.tie(NULL);
int n;
cin>>n;
vector<string> v(n, "");
for(int i=0;i<n;i++)
cin>>v[i];
cout<<div_s(v, n, 0, 0);
return 0;
}
|
cs |
728x90
'Problem Solving > BOJ 문제풀이' 카테고리의 다른 글
9019 DSLR (0) | 2021.04.25 |
---|---|
5525 IOIOI (0) | 2021.01.11 |
7662 이중 우선순위 큐 (0) | 2021.01.08 |
1541 잃어버린 괄호 (0) | 2021.01.05 |
11687 팩토리얼 0의 개수 (0) | 2021.01.04 |