#include <iostream>
#include <cstdio>
#include <cstring>
#include <algorithm>
using namespace std;
const int N=1e3+20;
char g[N][N];
int n,m,k,vis[N][N],res;
bool flag;
struct Move{
int x;
int y;
int k;//.个数
}off[4]={{-1,0},{1,0},{0,-1},{0,1}},num[N*N];
void dfs(int x,int y,int op)
{
res++;
if(op==2)
g[x][y]='*';
if((x==0||x==n-1||y==0||y==m-1)&&g[x][y]=='.'&&op==1)//connecet to border
{
flag=false;
res=0;
return;
}
vis[x][y]=1;
for(int i=0;i<4;i++)
{
int a=x+off[i].x;
int b=y+off[i].y;
if(a>=0&&a<n&&b>=0&b<m&&!vis[a][b]&&g[a][b]=='.')
{
if(op==1)
dfs(a,b,1);
if(op==2)
dfs(a,b,2);
}
}
}
bool cmp(Move a,Move b)
{
return a.k<b.k;
}
int main()
{
memset(vis,0,sizeof(vis));
cin>>n>>m>>k;
for(int i=0;i<n;i++)
scanf("%s",g[i]);
int cnt=0;
for(int i=0;i<n;i++)//计算每个water的.个数
{
for(int j=0;j<m;j++)
{
flag=true;
res=0;
if(!vis[i][j]&&g[i][j]=='.')
{
dfs(i,j,1);
if(flag)
{
num[cnt].k=res;
num[cnt].x=i;
num[cnt++].y=j;//记录连通块中任意一点即可
}
}
}
}
int ans=0;
memset(vis,0,sizeof(vis));
sort(num,num+cnt,cmp);
for(int i=0;i<=cnt-1-k;i++)//只保留k个
{
ans+=num[i].k;
dfs(num[i].x,num[i].y,2);
}
cout<<ans<<endl;
for(int i=0;i<n;i++)
printf("%s\n",g[i]);
return 0;
}
codeforces 375D dfs+模拟
最新推荐文章于 2021-02-13 09:48:04 发布