순간을 성실히, 화려함보단 꾸준함을

[ boj : 2799 ] 블라인드 본문

알고리즘,SQL/백준,BOJ

[ boj : 2799 ] 블라인드

폭발토끼 2022. 1. 31. 01:50

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

 

2799번: 블라인드

첫째 줄에 M과 N이 공백으로 구분해서 주어진다. (1 ≤ M, N ≤ 100) 다음 줄에는 현재 건너편 아파트의 상태가 주어진다. 모든 창문은 문제 설명에 나온 것 처럼 4*4 그리드로 주어진다. 또, 창문과

www.acmicpc.net

해설 : n과 m의 범위가 100이 최대이니 생성되는 격자의 크기는 501이 최대가 됩니다.

그러면 그냥 싹다 해보면 됩니다. 창문의 형태는 3차원 배열로 미리 정해놓고 for 문 덕지덕지 발라서 하나씩 전부 확인해가면서 차근차근 진행해 나아가면 됩니다.

전형적인 기본구현 문제여서 딱히 해설할 것도 없습니다.

#include<bits/stdc++.h>

using namespace std;
using ll = long long;

bool memo[510][510];
string arr[510];
string window[5][4] = {
	{
		{"...."},
		{"...."},
		{"...."},
		{"...."}
	},
	{
		{"****"},
		{"...."},
		{"...."},
		{"...."}
	},
	{
		{"****"},
		{"****"},
		{"...."},
		{"...."}
	},
	{
		{"****"},
		{"****"},
		{"****"},
		{"...."}
	},
	{
		{"****"},
		{"****"},
		{"****"},
		{"****"}
	}
};

void solve();

int main()
{
	ios::sync_with_stdio(false);
	cin.tie(nullptr);
	int t = 1;
	while (t--)solve();
	return 0;
}
void solve()
{
	int n, m;
	int ans[5] = { 0,0,0,0,0 };
	cin >> n >> m;
	for (int i = 0; i < n * 5 + 1; i++)
		cin >> arr[i];

	for (int i = 0; i < n * 5 + 1; i++) {
		for (int j = 0; j < m * 5 + 1; j++) {
			if (memo[i][j])continue;
			if (arr[i][j] == '#')continue;
			for (int k = 0; k < 5; k++) {
				bool flag = false;
				for(int p=0;p<4;p++)
					for (int q = 0; q < 4; q++) {
						if (arr[i+p][j+q] != window[k][p][q]) {
							flag = true;
							memo[i + p][j + q] = true;
							goto h;
						}
					}
			h:;
				if (!flag)ans[k]++;
			}
		}
	}
	for (int i = 0; i < 5; i++)cout << ans[i]<<" ";
}