codeforces 375D dfs+模拟

来源:互联网 发布:网络作家协会好加入吗 编辑:程序博客网 时间:2024/06/06 11:38

点击打开链接

#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;}


0 0