CF723D 【Lakes in Berland】

题目链接

题解 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;
}

猜你喜欢

转载自www.cnblogs.com/tonyshen/p/11734888.html