您的位置:首页 > 其它

codeforces723D-Lakes in Berland-DFS

2016-10-04 13:23 555 查看
题目大意:给你一张图,里面的连通块(不能含有边界)就是湖,现在你要在湖上面填泥土,使得这片土地上的湖数量减少到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;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  codeforces dfs