끄적끄적 코딩
article thumbnail

분할정복 문제입니다.

사각형에서 모든 숫자가 같으면 그 숫자에 대해서 카운트를 증가합니다.
다를 경우에 사각형을 9조각으로 나누어서 위의 작업을 반복합니다.
최종적으로 -1, 0, 1이 총 몇개의 사각형으로 이루어져있는지 출력합니다.

시작점 위치의 값을 check에 넣고 반복문을 통해서 다른 값들과 비교합니다.
다를경우 check=2로 바꾸고 9조각으로 나눠서 작업을 반복합니다.
같을 경우 check의 값에 따라 해당하는 카운트를 증가시켜줍니다.

 

#include <iostream>
#include <algorithm>
#include <cstring>
#include <string>
using namespace std;

int c[3];
int map[3000][3000];

void divCon(int n, int m, int x)
{
	int check = map[n][m];

	for (int i = n; i < n + x; ++i) {
		for (int j = m; j < m + x; ++j) {
			if (check == -1 && map[i][j] != -1) {
				check = 2;
			}
			else if (check == 0 && map[i][j] != 0) {
				check = 2;
			}
			else if (check == 1 && map[i][j] != 1) {
				check = 2;
			}
			if (check == 2) {
				int div = x / 3;
				divCon(n, m, div);
				divCon(n + div, m, div);
				divCon(n + div * 2, m, div);

				divCon(n, m + div, div);
				divCon(n + div, m + div, div);
				divCon(n + div * 2, m + div, div);

				divCon(n, m + div * 2, div);
				divCon(n + div, m + div * 2, div);
				divCon(n + div * 2, m + div * 2, div);
				return;
			}
		}
	}

	if (check == -1) {
		++c[0];
	}
	else if (check == 0) {
		++c[1];
	}
	else if (check == 1) {
		++c[2];
	}

	return;
}

int main(int argc, char *argv[])
{
	int n;

	cin >> n;

	memset(map, 0, sizeof(map));
	memset(c, 0, sizeof(c));
	for (int i = 0; i < n; ++i) {
		for (int j = 0; j < n; ++j) {
			cin >> map[i][j];
		}
	}

	divCon(0, 0, n);

	cout << c[0] << endl;
	cout << c[1] << endl;
	cout << c[2] << endl;

	return 0;
}

'알고리즘' 카테고리의 다른 글

[C++] 백준 10953번 A+B - 6  (0) 2019.09.08
[C++] 백준 1629번 곱셈  (0) 2019.09.08
[C++] 백준 1992번 쿼드트리  (0) 2019.09.08
[C++] 백준 2630번 색종이 만들기  (0) 2019.09.08
[C++] 백준 5430번 AC  (2) 2019.09.08

검색 태그