티스토리 뷰

알고리즘/분할정복

백준_쿼드트리

빨간공 2016. 9. 16. 21:41


[ 해결 방법 ]

재귀를 이용해서 문제를 풀었다. 재귀함수(시작점, 종료점)처럼 함수를 만들었다. 시작점부터 종료점까지 for문을 돌면서 색이 모두 같으면 그 색을 출력했고 다르면, 시작점부터 종료점까지의 면적을 4등분해서 4개의 재귀를 호출했다.


[ 코드 ]

#include <iostream>
#define MAX 65
using namespace std;
int N;
bool img[MAX][MAX];
void div(int sx, int sy, int ex, int ey)
{
bool p_cr, cr;
int cnt = 0;
p_cr = cr = img[sy][sx];
for (int y = sy; y <= ey; y++)
{
for (int x = sx; x <= ex; x++)
{
cr = img[y][x];
if (p_cr != cr)
{
cout << "(";
div(sx, sy, (ex + sx) / 2, (ey + sy) / 2);
div((ex + sx) / 2 + 1, sy, ex, (sy + ey) / 2);
div(sx, (sy + ey) / 2 + 1, (sx + ex) / 2, ey);
div((sx + ex) / 2 + 1, (sy + ey) / 2 + 1, ex, ey);
cout << ")";
return;
}
else
{
cnt++;
p_cr = cr;
}
}
}
if (cnt == ((ex - sx + 1) * (ey - sy + 1)))
cout << img[sy][sx];
}
int main()
{
cin >> N;
for (int i = 1; i <= N; i++)
{
char line[MAX];
cin >> line;
for (int j = 1; j <= N; j++)
img[i][j] = line[j - 1] - '0';
}
div(1, 1, N, N);
}


'알고리즘 > 분할정복' 카테고리의 다른 글

백준_종이의 개수  (0) 2016.09.21
백준_하노이 탑 이동 순서  (0) 2016.09.20
공지사항
최근에 올라온 글
최근에 달린 댓글
Total
Today
Yesterday
«   2024/05   »
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
글 보관함