先预处理外围联通块,简单的dfs一下存下联通块大小和位子,然后把大小排个序,然后就取k-size()个,然后再涂满就结束了/

代码如下:(写的有点丑,太长了)

#include <bits/stdc++.h>
using namespace std;
const int N=55;
char s[N][N];
char a[N][N];
int vis[N][N];
int dx[4]={1,-1,0,0};
int dy[4]={0,0,1,-1};
struct vv{
    int idx,idy,num;
}v[N*N];

int id=0;
bool cmp(vv aa,vv bb)
{
    if(aa.num==bb.num)
    {
        if(aa.idx==bb.idx) return aa.idy<bb.idy;
        else               return aa.idx<bb.idx;
    }
    else return aa.num<bb.num;
}

int cnt;
int n,m,k;

bool ck(int x,int y)
{
    if(x<1||x>n||y<1||y>m||s[x][y]=='*'||vis[x][y]) return false;
    else                                            return true;
}

void dfs(int x,int y)
{
    //cout<<x<<' '<<y<<endl;
    if(ck(x,y)) {cnt++;vis[x][y]=1;}
    else        return;
    //cout<<x<<' '<<y<<endl;
    for(int i=0;i<4;i++)
    {
        dfs(x+dx[i],y+dy[i]);
    }
}

void dfs1(int x,int y)
{
    if(!ck(x,y)) return;
    s[x][y]='*';
    for(int i=0;i<4;i++)
    {
        dfs1(x+dx[i],y+dy[i]);
    }
}

void init()
{
    for(int i=1;i<=n;i++)//1和m.
    {
        if(s[i][1]=='.')   dfs1(i,1);
        if(s[i][m]=='.')   dfs1(i,m);
    }
    for(int i=1;i<=m;i++)//1和n.
    {
        if(s[1][i]=='.')   dfs1(1,i);
        if(s[n][i]=='.')   dfs1(n,i);
    }
}

bool ck1(int x,int y)
{
    if(a[x][y]=='*') return false;
    else             return true;
}

void draw(int x,int y)
{
    if(!ck1(x,y)) return;
    a[x][y]='*';
    for(int i=0;i<4;i++)
    {
        draw(x+dx[i],y+dy[i]);
    }
}

int main()
{
    cin>>n>>m>>k;
    for(int i=1;i<=n;i++)
    {
        for(int j=1;j<=m;j++)
        {
            cin>>s[i][j];
            a[i][j]=s[i][j];
        }
    }
    init();
    for(int i=1;i<=n;i++)
    {
        for(int j=1;j<=m;j++)
        {
            if(s[i][j]=='.'&&!vis[i][j])    {dfs(i,j);v[++id].num=cnt;v[id].idx=i;v[id].idy=j;cnt=0;}
        }
    }
    sort(v+1,v+1+id,cmp);
    int ans=0;
    for(int i=1;i<=id-k;i++)
    {
        ans+=v[i].num;
    }
    cout<<ans<<endl;
    //cout<<v[1].idx<<' '<<v[1].idy<<endl;
    /*for(int i=1;i<=id;i++)
    {
        cout<<v[i].num<<' ';
    }cout<<endl;*/
    for(int i=1;i<=id-k;i++)
    {
        draw(v[i].idx,v[i].idy);
    }
    for(int i=1;i<=n;i++)
    {
        for(int j=1;j<=m;j++)
        {
            printf("%c",a[i][j]);
        }
        puts("");
    }
    puts("");
    return 0;
}