https://blog.csdn.net/guhaiteng/article/details/52730373 参考题解
http://codeforces.com/contest/723/problem/D 原题目
1 #include<iostream> 2 #include<cstdio> 3 #include <cctype> 4 #include<algorithm> 5 #include<cstring> 6 #include<cmath> 7 #include<string> 8 #include<cmath> 9 #include<set> 10 #include<vector> 11 #include<stack> 12 #include<queue> 13 #include<map> 14 using namespace std; 15 #define ll long long 16 #define mem(a,x) memset(a,x,sizeof(a)) 17 #define se second 18 #define fi first 19 const int INF= 0x3f3f3f3f; 20 const int N=2e5+5; 21 22 int n,m,k; 23 char mp[55][55]; 24 int vis[55][55]={0},tian[2600]={0}; 25 int dx[4]={1,-1,0,0},dy[4]={0,0,1,-1}; 26 int nn=0,cnt=0,flag=0,num=0; 27 28 pair<int,int>v[2600]; 29 30 bool cmp(pair<int,int> c ,pair<int,int> d) 31 { 32 return c.second<d.second; 33 } 34 35 void dfs(int nx,int ny) 36 { 37 num++; //块数++ 38 vis[nx][ny]=cnt; //是属于第几个块的 就涂第几种颜色 39 if(nx==n||nx==1||ny==1||ny==m) flag=1; //如果是海,就不能记入v中 40 for(int i=0;i<4;i++) 41 { 42 int x=nx+dx[i],y=ny+dy[i]; 43 if(x>n||x<1||y<1||y>m||mp[x][y]!='.'||vis[x][y]) continue; 44 dfs(x,y); 45 } 46 } 47 48 int main() 49 { 50 cin>>n>>m>>k; 51 for(int i=1;i<=n;i++) 52 scanf("%s",mp[i]+1); 53 for(int i=1;i<=n;i++) 54 { 55 for(int j=1;j<=m;j++) 56 { 57 if(mp[i][j]=='.'&& vis[i][j]==0) 58 { 59 num=0; //这个块 有多大 60 flag=0; 61 cnt++; //有几个联通块 62 dfs(i,j); 63 if(flag==0) { 64 nn++; 65 v[nn].first=cnt; 66 v[nn].second=num; 67 } 68 } 69 } 70 } 71 sort(v+1,v+1+nn,cmp); //升序 72 int ans=0; //需要填的所有块的总大小 即总cell数 73 int u=1; 74 int V=nn; 75 while(V>k) 76 { 77 V--; 78 ans+=v[u].second; 79 tian[ v[u].first ]=1;//填的第几块连通的区域标记为1 80 u++; 81 } 82 83 cout<<ans<<endl; 84 for(int i=1;i<=n;i++) 85 { 86 for(int j=1;j<=m;j++) 87 { 88 if( tian[ vis[i][j] ] ) //如果填的第vis[i][j]块的区域标记为1 89 cout<<'*'; //就填了 90 else cout<<mp[i][j]; 91 } 92 cout<<endl; 93 } 94 }