zoukankan      html  css  js  c++  java
  • 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
    ",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;
    }
    自己选择的路,跪着也要走完
  • 相关阅读:
    接口测试再思考
    Python开发简单爬虫
    正则表达式(Python)
    Git常用方法
    CNN--卷积神经网络从R-CNN到Faster R-CNN的理解(CIFAR10分类代码)
    一看就懂的K近邻算法(KNN),K-D树,并实现手写数字识别!
    我是这样一步步理解--主题模型(Topic Model)、LDA(案例代码)
    你想知道的特征工程,机器学习优化方法都在这了!收藏!
    从似然函数到EM算法(附代码实现)
    一次性弄懂马尔可夫模型、隐马尔可夫模型、马尔可夫网络和条件随机场!(词性标注代码实现)
  • 原文地址:https://www.cnblogs.com/tonyshen/p/11734888.html
Copyright © 2011-2022 走看看