vidigummy KAU/알고리즘 공부(백준!)

BOJ 1780 종이의 개수

vidi 2021. 1. 10. 01:48

www.acmicpc.net/problem/1780

 

1780번: 종이의 개수

N×N크기의 행렬로 표현되는 종이가 있다. 종이의 각 칸에는 -1, 0, 1의 세 값 중 하나가 저장되어 있다. 우리는 이 행렬을 적절한 크기로 자르려고 하는데, 이때 다음의 규칙에 따라 자르려고 한다.

www.acmicpc.net

또또또또또또또또또 그놈의 scanf printf 아니면 시간초과라니 진절머리가 난다.

#pragma warning(disable: 4996)
#include <iostream>
#include <vector>

using namespace std;

int check(vector<vector<int>> paper, int size)
{
	int standard= paper[0][0];
	for (int i = 0; i < size; ++i)
	{
		for (int j = 0; j < size;++j)
		{
			if (paper[i][j] != standard)
				return 2;
		}
	}
	return standard;
}
void cutting(vector<vector<int>> paper, vector<int>& ans, int size)
{

	int state = check(paper, size);
	if (state != 2)
	{
		ans[state + 1]++;
	}
	else
	{
		vector<vector<int>> p1(size/3), p2(size / 3), p3(size / 3), p4(size / 3), p5(size / 3), p6(size / 3), p7(size / 3), p8(size / 3), p9(size / 3);

		for (int i = 0; i < size / 3; i++)
		{
			p1[i] = vector<int>(size / 3);
			p2[i] = vector<int>(size / 3); p3[i] = vector<int>(size / 3); p4[i] = vector<int>(size / 3); p5[i] = vector<int>(size / 3);
			p6[i] = vector<int>(size / 3); p7[i] = vector<int>(size / 3); p8[i] = vector<int>(size / 3); p9[i] = vector<int>(size / 3);
			for (int j = 0; j < size / 3; j++)
			{
				p1[i][j] = paper[i][j];
				p2[i][j] = paper[i][j + (size / 3)];
				p3[i][j] = paper[i][j + (2 * (size / 3))];
				p4[i][j] = paper[i + (size / 3)][j];
				p5[i][j] = paper[i + (size / 3)][j + (size / 3)];
				p6[i][j] = paper[i + (size / 3)][j + (2 * (size / 3))];
				p7[i][j] = paper[i + (2 * (size / 3))][j];
				p8[i][j] = paper[i + (2 * (size / 3))][j + (size / 3)];
				p9[i][j] = paper[i + (2 * (size / 3))][j + (2 * (size / 3))];
			}
		}
		cutting(p1, ans, size / 3); cutting(p2, ans, size / 3); cutting(p3, ans, size / 3); cutting(p4, ans, size / 3); cutting(p5, ans, size / 3); cutting(p6, ans, size / 3); cutting(p7, ans, size / 3); cutting(p8, ans, size / 3); cutting(p9, ans, size / 3);
	}
}
int main()
{
	cin.tie();
	cout.tie();
	vector<int> ans(4);
	ans[0] = ans[1] = ans[2] = 0;
	int N;
	scanf("%d", &N);
	vector<vector<int>> paper(N+1);
	for (int i = 0; i < N; i++)
	{
		paper[i] = vector<int>(N + 1);
		for (int j = 0; j < N; j++)
		{
			scanf("%d", &paper[i][j]);
		}
	}
	cutting(paper, ans, N);
	printf("%d\n%d\n%d", ans[0], ans[1], ans[2]);
	return 0;
}

'vidigummy KAU > 알고리즘 공부(백준!)' 카테고리의 다른 글

BOJ 11279/1927 최대힙/최소힙  (0) 2021.01.14
BOJ 1202 보석도둑  (0) 2021.01.14
BOJ 16916 부분 문자열  (0) 2021.01.09
BOJ 1992 쿼드트리  (0) 2021.01.08