• 【Codeforces 723D】Lakes in Berland (dfs)


    海洋包围的小岛,岛内的有湖,'.'代表水,'*'代表陆地,给出的n*m的地图里至少有k个湖,求填掉面积尽量少的水,使得湖的数量正好为k。

    dfs找出所有水联通块,判断一下是否是湖(海水区非湖)。将湖按面积排序,若湖的数量为cnt,填掉前cnt-k个湖。

    http://codeforces.com/problemset/problem/723/D

    Examples
    input
    5 4 1
    ****
    *..*
    ****
    **.*
    ..**
    output
    1
    ****
    *..*
    ****
    ****
    ..**
    input
    3 3 0
    ***
    *.*
    ***
    output
    1
    ***
    ***
    ***
    #include<bits/stdc++.h>
    using namespace std;
    int n,m,k;
    char a[55][55];
    bool vis[55][55];
    int dx[6]={0,0,1,-1};
    int dy[6]={1,-1,0,0};
    
    int num,cnt,islake;
    int ans;
    struct lake{
        int x,y;
        int num;
        int id;
    }lk[3600];
    bool cmp(lake a,lake b){
        return a.num<b.num;
    }
    void dfs(int x,int y){
        vis[x][y]=1;
        num++;
        if(x==0||x==n-1||y==0||y==m-1)islake=0;
        for(int i=0;i<4;i++){
            int nx=x+dx[i],ny=y+dy[i];
            if(nx>=0&&nx<n&&ny<m&&ny>=0&&a[nx][ny]=='.'&&!vis[nx][ny])
                dfs(nx,ny);
        }
    }
    void fil(int x,int y,int id){
        vis[x][y]=1;
        ans++;
        a[x][y]='*';
        for(int i=0;i<4;i++){
            int nx=x+dx[i],ny=y+dy[i];
            if(nx>=0&&nx<n&&ny<m&&ny>=0&&a[nx][ny]=='.'&&!vis[nx][ny])
                fil(nx,ny,id);
        }
    }
    int main(){
        scanf("%d%d%d",&n,&m,&k);
        for(int i=0;i<n;i++)
                scanf(" %s",a[i]);
        for(int i=0;i<n;i++)
            for(int j=0;j<m;j++)
                if(!vis[i][j]&&a[i][j]=='.'){
                    num=0;
                    islake=1;
                    dfs(i,j);
                    if(islake)lk[cnt++]=(lake){i,j,num,cnt};
                }
        memset(vis,0,sizeof vis);
        sort(lk,lk+cnt,cmp);
        for(int l=0;l<cnt-k;l++)
            for(int i=0;i<n;i++)
                for(int j=0;j<m;j++)
                    if(i==lk[l].x&&j==lk[l].y)
                        fil(i,j,lk[l].id);
        printf("%d
    ",ans);
        for(int i=0;i<n;i++)
            printf("%s
    ",a[i]);
    }

      

  • 相关阅读:
    shell80set变量
    shell79控制多进程的数量
    shell78管道
    sina sae开发中出现的问题
    html中代码高亮显示
    handlebars模板替换
    打印目录下所有的文件名(包含深层次目录)
    input为disabled提交后得不到该值的解决方法
    Global和Globals
    js算法运算
  • 原文地址:https://www.cnblogs.com/flipped/p/5930002.html
Copyright © 2020-2023  润新知