#include <bits/stdc++.h>
using namespace std; // 使用C++标准命名空间
const int N = 1e3; // 定义一个常量N,值为1000,用于数组的大小
char s[N][N]; // 定义一个二维字符数组,存储输入的字符矩阵
bool vis[N][N]; // 定义一个二维布尔数组,标记字符是否需要被替换
int main() { // 主函数入口
int n, m; // 定义n和m,分别表示字符矩阵的行数和列数
cin >> n >> m; // 从标准输入读取n和m的值
for (int i = 0; i < n; i++) { // 循环读取字符矩阵的每一行
cin >> s[i]; // 将输入的每一行存储在s数组中
}
// 下面的循环用于标记水平方向上连续的三个'*'字符,将中间的'*'标记为需要被替换
for (int i = 0; i < n; i++) {
for (int j = 1; j < m - 1; j++) {
if (s[i][j] == '*' && s[i][j - 1] == '*' && s[i][j + 1] == '*') {
vis[i][j - 1] = 1; // 标记左侧'*'
vis[i][j] = 1; // 标记中间的'*'
vis[i][j + 1] = 1; // 标记右侧的'*'
}
}
}
// 下面的循环用于标记垂直方向上连续的三个'*'字符,将中间的'*'标记为需要被替换
for (int i = 0; i < m; i++) {
for (int j = 1; j < n - 1; j++) {
if (s[j][i] == '*' && s[j - 1][i] == '*' && s[j + 1][i] == '*') {
vis[j - 1][i] = 1; // 标记上方的'*'
vis[j][i] = 1; // 标记中间的'*'
vis[j + 1][i] = 1; // 标记下方的'*'
}
}
}
// 输出处理后的字符矩阵,被标记的'*'字符替换为'.'
for (int i = 0; i < n; i++) {
for (int j = 0; j < m; j++) {
if (vis[i][j]) {
cout << '.'; // 如果该位置的字符被标记,则输出'.'
} else {
cout << s[i][j]; // 否则输出原字符
}
}
cout << endl; // 每输出完一行后换行
}
return 0; // 主函数返回0,表示程序正常结束
}