/*
* Problem :: 5212 / 지구 온난화
*
* Kind :: Simulation
*
* Insight
* - 인접한 칸들을 확인해서 땅이 잠기는지 그렇지 않은지 확인하는 건 쉽다
* + 문제는... 출력해야되는 지도가 작아진다는 것이다!
* # 출력해야되는 지도의 왼쪽 위 좌표와 오른족 아래 좌표를 잡고
* 잠기지 않은 땅을 발견할 때마다 이를 갱신해주는 식으로
* 지도의 크기를 추적해주자
*/
//
// BOJ
// ver.C++
//
// Created by GGlifer
//
// Open Source
#include <iostream>
#include <cstring>
using namespace std;
#define endl '\n'
// Set up : Global Variables
int R, C;
int dy[4] = {+1, 0, 0, -1};
int dx[4] = {0, +1, -1, 0};
// Set up : Functions Declaration
bool isValid(int y, int x);
int main()
{
// Set up : I/O
ios::sync_with_stdio(false);
cin.tie(nullptr);
// Set up : Input
cin >> R >> C;
char A[R][C];
for (int i=0; i<R; i++)
for (int j=0; j<C; j++)
cin >> A[i][j];
// Process
char B[R][C]; /* 50년 후 지도 */
memcpy(B, A, sizeof(B));
/* 출력해야되는 직사각형 지도의 왼쪽 위 좌표, 오른쪽 아래 좌표 초기화
* ul - upper left, lr - lower right */
int uly = R, ulx = C, lry = -1, lrx = -1;
for (int i=0; i<R; i++) {
for (int j=0; j<C; j++) {
if (A[i][j] == 'X') {
int sea = 0; /* 인접한 바다칸 개수 */
for (int k=0; k<4; k++) {
int ay = i + dy[k];
int ax = j + dx[k];
if (not(isValid(ay, ax)) || A[ay][ax] == '.') {
sea++;
}
}
if (sea >= 3) { /* 인접한 바다칸 개수가 3개 이상이면 */
B[i][j] = '.'; /* 50년 후 잠김 */
} else { /* 인접한 바다칸 개수가 3개 미만이면 50년 후 잠기지 않음 */
/* 잠기지 않는 땅 발견 - 지도의 왼쪽 위, 오른쪽 아래 좌표 갱신 */
uly = min(uly, i); /* 왼쪽 위 y 좌표 갱신 */
ulx = min(ulx, j); /* 왼쪽 위 x 좌표 갱신 */
lry = max(lry, i); /* 오른쪽 아래 y 좌표 갱신 */
lrx = max(lrx, j); /* 오른쪽 아래 x 좌표 갱신 */
}
}
}
}
// Control : Output
for (int i=uly; i<=lry; i++) {
for (int j=ulx; j<=lrx; j++) {
cout << B[i][j];
} cout << endl;
}
}
// Helper Functions
bool isValid(int y, int x)
/* 주어진 좌표 (y,x) 가 유효하면 true 를 반환, 그 외 false 를 반환 */
{
return y >= 0 && y < R && x >= 0 && x < C;
}