알고리즘 문제 해결/BOJ

[분할 정복] BOJ 1992 쿼드 트리

jmkimmessi 2021. 11. 30. 00:00
반응형

https://www.acmicpc.net/problem/1992

 

1992번: 쿼드트리

첫째 줄에는 영상의 크기를 나타내는 숫자 N 이 주어진다. N 은 언제나 2의 제곱수로 주어지며, 1 ≤ N ≤ 64의 범위를 가진다. 두 번째 줄부터는 길이 N의 문자열이 N개 들어온다. 각 문자열은 0 또

www.acmicpc.net

 

 

문제 해결 알고리즘

 

nXn 사분면에서 모든 숫자들이 같지 않으면 또 사분면으로 나누어서 분할 정복을 실행해준다. 만약 같다면 그 숫자를 출력해준다.

 

소스 코드

 

#include <bits/stdc++.h>
#define MAX 65
using namespace std;

int N;
int arr[MAX][MAX];

void div_n_coqr(int n, int x, int y){

  bool flag = true;

  for(int i=x;i<n+x;i++){
    for(int j=y;j<n+y;j++){
      if(arr[x][y] != arr[i][j]) flag = false;
    }
  }

  if(!flag){
    cout << '(';
    div_n_coqr(n/2, x, y);
    div_n_coqr(n/2, x, y+n/2);
    div_n_coqr(n/2, x+n/2, y);
    div_n_coqr(n/2, x+n/2, y+n/2);
    cout << ')';
  }
  else cout << arr[x][y];
}

int main(){

  cin >> N;
  string str;

  for(int i=0;i<N;i++) {
    cin >> str;
    for(int j=0;j<N;j++){
      arr[i][j] = str[j] - '0';
    }
  }
    
  div_n_coqr(N, 0, 0);
}

 

반응형