D. Lakes in Berland (DFS+连通块

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 }
 

猜你喜欢

转载自www.cnblogs.com/thunder-110/p/9336533.html