题目描述
手机端QQ推出了贴表情的新功能,复读机势力再次猖狂起来,她们把表情贴的到处都是!裙主决定把被复读次数最多的表情从聊天记录中删去。
聊天框是一个大小为n x m的黑白点阵。背景色是白色。我们定义“表情”是由黑色色块组成的极大四连通块。你的任务是找出聊天框中出现次数最多的表情,把这些表情都涂成白色,然后把处理好的聊天框输出出来。
保证表情的大小都小于32 x 32。
保证出现次数最多的表情只有一种。
“极大四连通块”的定义为:从某一个黑色格子出发,向上下左右四个方向任意移动,且移动时不经过白色格子,通过这种移动方式能到达的所有黑色点称为一个“极大四连通块”。
请参照样例理解题意。
输入
第一行两个整数n和m。 (1 =< n, m <= 1000)
接下来n行,每行一个长度为m的字符串。表示整个n x m的聊天框。
其中使用`.`来表示白色,使用`X`表示黑色。
输出
输出n行,每行一个长度为m的字符串。表示处理之后的聊天框。
样例输入
<span style="color:#333333">10 40
........................................
..X..X..X..X.....XXXXXX...X...X..X......
..X..X..X..X.....X........X...X..X......
..X..X..X..X.....X........X...X..X......
..X..X..X..X.....XXXXX....X...X..X......
..X..X..XXXXXX.......X....X...XXXXXX....
..X..X.....X.........X....X......X......
..X..X.....X.........X....X......X......
..X..X.....X.....XXXXX....X......X......
........................................
</span>
样例输出
<span style="color:#333333">........................................
........X..X.....XXXXXX.......X..X......
........X..X.....X............X..X......
........X..X.....X............X..X......
........X..X.....XXXXX........X..X......
........XXXXXX.......X........XXXXXX....
...........X.........X...........X......
...........X.........X...........X......
...........X.....XXXXX...........X......
........................................</span>
#include<bits/stdc++.h>
#define INF 0x3f3f3f3f
#define ll long long
#define mem(ar,num) memset(ar,num,sizeof(ar))
#define me(ar) memset(ar,0,sizeof(ar))
#define lowbit(x) (x&(-x))
#define IOS ios::sync_with_stdio(false)
#define DEBUG cout<<endl<<"DEBUG"<<endl;
using namespace std;
int n, m, mp[1010][1010], vis[1010][1010], kuai;
int net[4][2] = {{1, 0}, {-1, 0}, {0, -1}, {0, 1}};
char arr[1010][1010];
struct node {
int x, y;
};
map<vector<int>, vector<int>> ma;
map<int, int> md;
void bfs(int x, int y, int w) {
queue<node> q;
vector<int> v;
v.clear();
q.push((node) {
x, y
});
v.push_back(0);
vis[x][y] = 1;
while(!q.empty()) {
node no = q.front();
q.pop();
vis[no.x][no.y] = 1;
mp[no.x][no.y] = w;
for(int i = 0; i < 4; i++) {
int a = no.x + net[i][0], b = no.y + net[i][1];
if(a >= 0 && a < n && b >= 0 && b < m && !vis[a][b] && arr[a][b] == 'X') {
q.push((node) {
a, b
});
v.push_back(a - x);
}
}
}
ma[v].push_back(w);
}
int main() {
cin >> n >> m;
for(int i = 0; i < n; i++)
cin >> arr[i];
for(int i = 0; i < n; i++)
for(int j = 0; j < m; j++)
if(!vis[i][j] && arr[i][j] == 'X') {
bfs(i, j, ++kuai);
}
int maxx = 0;
for(auto &s : ma) {
if(s.second.size() > maxx) {
maxx = s.second.size();
}
}
for(auto &s : ma) {
if(s.second.size() == maxx)
for(auto k : s.second) {
md[k] = 1;
}
}
for(int i = 0; i < n; i++) {
for(int j = 0; j < m; j++) {
if(md[mp[i][j]] == 1) {
cout << '.';
} else
cout << arr[i][j];
}
cout << endl;
}
return 0;
}