题目链接
题解 CF723D 【Lakes in Berland】
首先将边界的水用bfs处理掉
再将中间的每一个湖泊处理出来,存入一个结构体内,结构体里记录湖泊大小和开始点
将湖泊排序从小往大填满,并利用开始点进行bfs改变地图
细节见代码:
#include<bits/stdc++.h> using namespace std; int n,m,k; int vis[100][100],mapp[100][100]; int dx[5]={0,-1,0,1,0}; int dy[5]={0,0,1,0,-1},cnt; struct SYM{ int cc,sx,sy; }lake[10000]; void bfs(int x,int y,int opt){ queue<int> qx,qy;int siz=0; if(opt==1){ //处理边界 vis[x][y]=1;qx.push(x);qy.push(y); while(!qx.empty()){ int xx=qx.front(),yy=qy.front();qx.pop();qy.pop(); for(int i=1;i<=4;i++){ int nx=xx+dx[i],ny=yy+dy[i]; if(nx==0||ny==0||nx==n+1||ny==m+1) continue; if(vis[nx][ny]) continue; vis[nx][ny]=1; qx.push(nx);qy.push(ny); } } } if(opt==0){ //处理湖泊 vis[x][y]=1;qx.push(x);qy.push(y); while(!qx.empty()){ int xx=qx.front(),yy=qy.front();qx.pop();qy.pop(); siz++; for(int i=1;i<=4;i++){ int nx=xx+dx[i],ny=yy+dy[i]; if(nx==0||ny==0||nx==n+1||ny==m+1) continue; if(vis[nx][ny]) continue; vis[nx][ny]=1; qx.push(nx);qy.push(ny); } } lake[++cnt].cc=siz;lake[cnt].sx=x;lake[cnt].sy=y; //存入湖泊大小和开始点 } if(opt==2){ //改变地图 mapp[x][y]=1;qx.push(x);qy.push(y); while(!qx.empty()){ int xx=qx.front(),yy=qy.front();qx.pop();qy.pop(); siz++; for(int i=1;i<=4;i++){ int nx=xx+dx[i],ny=yy+dy[i]; if(nx==0||ny==0||nx==n+1||ny==m+1) continue; if(mapp[nx][ny]) continue; mapp[nx][ny]=1; qx.push(nx);qy.push(ny); } } } } bool cmp(const SYM &a,const SYM &b){ return a.cc>b.cc; } int main(){ char c[1000]; scanf("%d%d%d",&n,&m,&k); for(int i=1;i<=n;i++){ scanf("%s",c); for(int j=0;j<m;j++) mapp[i][j+1]=vis[i][j+1]=(c[j]=='*'); } for(int i=1;i<=n;i++){ //处理边界水 if(mapp[i][1]==0&&vis[i][1]==0) bfs(i,1,1); if(mapp[i][m]==0&&vis[i][m]==0) bfs(i,m,1); } for(int i=1;i<=m;i++){ if(mapp[1][i]==0&&vis[1][i]==0) bfs(1,i,1); if(mapp[n][i]==0&&vis[n][i]==0) bfs(n,i,1); } for(int i=1;i<=n;i++) for(int j=1;j<=m;j++) if(!vis[i][j]) bfs(i,j,0); sort(lake+1,lake+cnt+1,cmp); //湖泊按大小排序 int ans=0; while(cnt>k){ //填湖泊 ans+=lake[cnt].cc; bfs(lake[cnt].sx,lake[cnt].sy,2); //改地图 cnt--; } printf("%d ",ans); for(int i=1;i<=n;i++){ for(int j=1;j<=m;j++){ if(mapp[i][j]==1) printf("*"); else printf("."); } printf(" "); } return 0; }