※이 설명은 공식 솔루션이 아닌 작성자의 개인적인 솔루션입니다.
창문의 크기는 4*4로 고정이며, i행 j열의 창문의 왼쪽 위 좌표는
$5*(i-1)+1, 5*(j-1)+1$
인 점을 이용하여 창문의 종류를 구해주면 됩니다. 단, 문제에서 주어진 형식의 창문이 아닌 형태가 주어질 수도 있으니 그 부분에 대한 예외처리가 추가되면 됩니다.
※해당 소스코드는 참고용이며, 최적화 된 공식 솔루션 소스가 아닙니다. 이 소스를 그대로 복사하여 이용, 또는 제출하는 행위에 대한 불이익은 책임지지 않습니다.
#include<iostream>
#include<string>
#include<algorithm>
typedef long long ll;
using namespace std;
string s[501];
int ans[5];
void check(int x, int y)
{
int ret = 0;
for (int i = x; i < x + 4; i++)
{
string tmp;
for (int j = y; j < y + 4; j++) tmp += s[i][j];
if (tmp == "****") ret++;
else if (tmp != "....") return;
}
ans[ret]++;
}
int main()
{
ios::sync_with_stdio(false);
int w, h;
cin >> w >> h;
for (int i = 0; i < 5 * w + 1; i++) cin >> s[i];
for (int i = 0; i < w; i++)
for (int j = 0; j < h; j++)
check(5 * i + 1, 5 * j + 1);
for (int i = 0; i < 5; i++) cout << ans[i] << " ";
}