题目链接
题解 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\n",ans);
for(int i=1;i<=n;i++){
for(int j=1;j<=m;j++){
if(mapp[i][j]==1) printf("*");
else printf(".");
}
printf("\n");
}
return 0;
}