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