先预处理外围联通块,简单的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;
}

京公网安备 11010502036488号