박스 그림 문자를 통해서 만든 모양 중에 선이 끊어진 곳이 없는 모양을 '아름다운 모양'이라고 한다. 어떤 모양이 주어졌을때, 이를 아름다운 모양으로 만들어야 한다.
정말 쉬운 구현 문제였습니다.
주어진 입력을 3 * 3 단위의 모양으로 쪼개서 저장을 합니다. 조건을 보면 가 홀수인 경우에만 해당 공간이 비어있게 됩니다. 따라서 가 홀수인 경우에만 상하좌우의 인접한 모양을 확인해줍니다. 인접한 모양이 경계 부분에 '#'를 가지고 있는지 확인을 해보면 됩니다. 만약 '#'가 존재한다면 현재 모양의 인접한 그 부분에 '#'을 추가해주면 됩니다.
마지막으로 현재 모양에 '#'가 존재한다면 중앙에 '#'를 추가해주면 됩니다.
#include <bits/stdc++.h>
#define MAX 301
using namespace std;
struct Block {
char arr[3][3];
}block[MAX][MAX];
int n, m;
void func(int r, int c)
{
if (r != 1 && block[r - 1][c].arr[2][1] == '#')
block[r][c].arr[0][1] = '#';
if (c != 1 && block[r][c - 1].arr[1][2] == '#')
block[r][c].arr[1][0] = '#';
if (r != n && block[r + 1][c].arr[0][1] == '#')
block[r][c].arr[2][1] = '#';
if (c != m && block[r][c + 1].arr[1][0] == '#')
block[r][c].arr[1][2] = '#';
bool flag = false;
for (int i = 0; i < 3; i++)
for (int j = 0; j < 3; j++)
if (block[r][c].arr[i][j] == '#')
flag = true;
if (flag)
block[r][c].arr[1][1] = '#';
}
int main(void)
{
cin >> n >> m;
for (int i = 0; i < 3 * n; i++)
for (int j = 0; j < 3 * m; j++)
cin >> block[i / 3 + 1][j / 3 + 1].arr[i % 3][j % 3];
for (int i = 1; i <= n; i++)
for (int j = 1; j <= m; j++)
if((i + j) % 2 == 1)
func(i, j);
for (int i = 0; i < 3 * n; i++)
{
for (int j = 0; j < 3 * m; j++)
cout << block[i / 3 + 1][j / 3 + 1].arr[i % 3][j % 3];
cout << '\n';
}
return 0;
}