codeforces723D-Lakes in Berland-DFS

来源:互联网 发布:javascript跳转新页面 编辑:程序博客网 时间:2024/06/07 11:33

题目大意给你一张图,里面的连通块(不能含有边界)就是湖,现在你要在湖上面填泥土,使得这片土地上的湖数量减少到k个,问你最少要填多少块泥土;

题目解析:首先要使湖的数量减少,肯定要使一整个湖填完,否则这个湖只可能变成1个或2个,所以我们需要对所有的湖排个序,把面积最小的湖填掉就可以了,把湖初始化出来只要dfs可以了,填湖再dfs一下即可;

AC代码:

#include<iostream>#include<cstdio>#include<algorithm>#include<cstring>#include<string>#include<vector>using namespace std;int n,m,f,k,ans;char graph[51][51];bool flag[51][51];bool ocean(int i,int j){if(i==1||j==1||i==n||j==m)return false;else return true;}struct point{int x,y;int area;point(int a,int b,int c){x=a;y=b;area=c;}};vector<point>vec;int dfs(int a,int b){flag[a][b]=1;int area=1;if(ocean(a+1,b)==1&&graph[a+1][b]=='.'&&flag[a+1][b]==0)area+=dfs(a+1,b);else if(ocean(a+1,b)==0&&graph[a+1][b]=='.'&&flag[a+1][b]==0){area+=dfs(a+1,b);f=0;}if(ocean(a,b+1)==1&&graph[a][b+1]=='.'&&flag[a][b+1]==0)area+=dfs(a,b+1);else if(ocean(a,b+1)==0&&graph[a][b+1]=='.'&&flag[a][b+1]==0){area+=dfs(a,b+1);f=0;}if(ocean(a-1,b)==1&&graph[a-1][b]=='.'&&flag[a-1][b]==0)area+=dfs(a-1,b);else if(ocean(a-1,b)==0&&graph[a-1][b]=='.'&&flag[a-1][b]==0){area+=dfs(a-1,b);f=0;}if(ocean(a,b-1)==1&&graph[a][b-1]=='.'&&flag[a][b-1]==0)area+=dfs(a,b-1);else if(ocean(a,b-1)==0&&graph[a][b-1]=='.'&&flag[a][b-1]==0){area+=dfs(a,b-1);f=0;}return area;}bool cmp(point a,point b){return a.area<b.area;}void dfss(int a,int b){graph[a][b]='*';ans++;flag[a][b]=0;if(graph[a+1][b]=='.'&&flag[a+1][b])dfss(a+1,b);if(graph[a][b+1]=='.'&&flag[a][b+1])dfss(a,b+1);if(graph[a-1][b]=='.'&&flag[a-1][b])dfss(a-1,b);if(graph[a][b-1]=='.'&&flag[a][b-1])dfss(a,b-1);}int main(){int i,j;string s;while(scanf("%d%d%d",&n,&m,&k)!=EOF){vec.clear();memset(flag,0,sizeof(flag));for(i=1;i<=n;i++){cin>>s;for(j=1;j<=m;j++){graph[i][j]=s[j-1];}}for(i=1;i<=n;i++){for(j=1;j<=m;j++){if(flag[i][j]==0&&graph[i][j]=='.'){f=1;if(ocean(i,j)){point temp(i,j,dfs(i,j));if(f==1)vec.push_back(temp);}}}}int sum=vec.size();int tar=sum-k;sort(vec.begin(),vec.end(),cmp);ans=0;for(i=0;i<tar;i++){dfss(vec[i].x,vec[i].y);}printf("%d\n",ans);for(i=1;i<=n;i++){for(j=1;j<=m;j++)printf("%c",graph[i][j]);printf("\n");}}return 0;}


0 0
原创粉丝点击