[백준 1992번] 쿼드트리
2017. 8. 1. 00:19ㆍ알고리즘/백준
반응형
푸는 방법
1. 재귀를 통해 왼쪽위, 오른쪽위, 왼쪽아래, 오른쪽아래 총 4등분을 시키면서 스택에 쌓아둔다.
2. ) -> 닫히는 괄호를 써야할때 겹치는 숫자가 있는지 판별하고 닫는다.
2-1. 겹치는 숫자가 1이라면 괄호를 열리는 괄호랑 닫히는괄호를 다없애고 1만 스택에 다시 쌓는다.
2-2. 겹치는 숫자가 0이라면 괄호를 열리는 괄호랑 닫히는괄호를 다없애고 0만 스택에 다시 쌓는다.
소스코드
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 | #include <iostream> using namespace std; int n, img[65][65], sp = 0; char st[1000001]; void push(char a) { st[sp++] = a; } char pop() { return st[--sp]; } void Divsq(int ax,int ay, int bx,int by, int scale) { if (scale == 2) { int c[4]; int o = 0, z = 0; c[0] = img[ax][ay]; c[1] = img[ax][ay + 1]; c[2] = img[ax+1][ay]; c[3] = img[ax+1][ay+1]; for (int i = 0; i < 4; i++) { if (c[i]) o++; else z++; } if (o == 4) push(1+'0'); else if (z == 4) push(0 + '0'); else { push('('); for (int i = 0; i < 4; i++) push(c[i] + '0'); push(')'); } return; } // 왼쪽 위 push('('); Divsq(ax, ay, ax + (scale / 2 - 1), ay+(scale / 2 - 1), scale / 2); // 오른쪽 위 Divsq(ax,ay+ (scale / 2), ax + (scale/2 - 1), ay+(scale/2 -1)+(scale/2), scale / 2); // 왼쪽 아래 Divsq(ax+scale / 2, ay, bx , ay+(scale / 2-1), scale / 2); // 오른쪽 아래 Divsq(ax+scale / 2, ay + scale / 2, bx, by, scale / 2); push(')'); int o = 0, z=0; for (int i = sp - 2; i >= sp - 5; i--) { if (st[i]==1+'0') o++; else if (st[i]==0+'0') z++; } if (o == 4) { sp -= 6; push(1 + '0'); } else if (z == 4) { sp -= 6; push(0 + '0'); } } int main() { cin >> n; for (int i = 1; i <= n; i++) { for (int j = 1; j <= n; j++) { char a; cin >> a; img[i][j] = a - '0'; } } Divsq(1,1,n,n,n); for (int i = 0; i < sp; i++) { cout << st[i]; } return 0; } | cs |
반응형
'알고리즘 > 백준' 카테고리의 다른 글
[백준 3055번] 탈출 (0) | 2017.08.09 |
---|---|
[백준 7490번] 0 만들기 (2) | 2017.08.08 |
[백준 9935번]문자열 폭발 (1) | 2017.07.28 |
[백준 2089번] -2진수 (0) | 2017.07.28 |
[백준 9934번] 완전 이진 트리 (0) | 2017.07.27 |