消灭复读机

题目描述

手机端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;
}

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值