• Codeforces 723D. Lakes in Berland


    解题思路:

      1.dfs所有的水,顺便计数大小并判断是不是湖。

      2.如果是湖,将大小和坐标存下来。

      3.对湖按大小从小到大排序。

      4.dfs前(湖的数量-k)个湖,用*填充这些湖。

    代码:

      

    #include <bits/stdc++.h>
    using namespace std;
    typedef long long ll;
    
    struct lake{
        int x;int y;
        int size;
        bool islake;
    };
    vector <lake> l;
    
    char a[55][55];
    bool used[55][55];
    int n,m,k;
    int dir[4][2] = {1,0,-1,0,0,1,0,-1};
    
    bool cmp(lake p,lake q){
        return p.size < q.size;
    }
    
    
    void dfs(int x,int y,lake &t){
    //    cout << x << " " << y << " l" << endl;
        if(x == 1 or y == 1 or x == n or y == m) t.islake = false;
        t.size++;
        used[x][y] = true;
        for(int i = 0;i < 4; ++i){
            int conx = x+dir[i][0];
            int cony = y+dir[i][1];
            if(!used[conx][cony] and a[conx][cony] == '.'){
                dfs(conx, cony, t);
            }
        }
    }
    
    void dfsfill(int x,int y){
        a[x][y] = '*';
        for(int i = 0;i < 4; ++i){
            int conx = x+dir[i][0];
            int cony = y+dir[i][1];
            if(a[conx][cony] == '.'){
                dfsfill(conx, cony);
            }
        }
    }
    
    int main(){
           ios::sync_with_stdio(false);
           cin >> n >> m >> k;
         for(int i = 1;i <= n; ++i) cin >> a[i]+1;     
         for(int i = 1;i <= n; ++i){
             for(int j = 1;j <= m; ++j){
                if(!used[i][j] and a[i][j] == '.'){
                    lake t;
                    t.x = i;t.y = j;
                    t.size = 0;
                    t.islake = true;
                    dfs(i, j, t);
                    if(t.islake){
    //                    cout << t.x << " " << t.y <<" " << t.size << endl;
                        l.push_back(t);
                    }
                }
            }
        }
        sort(l.begin(),l.end(),cmp);
        int s = l.size() - k;
        int ans = 0;
        for(int i = 0;i < s; ++i){
            ans += l[i].size;
            dfsfill(l[i].x, l[i].y);
        }
        cout << ans << endl;
        for(int i = 1;i <= n; ++i) cout << a[i]+1 << endl;
        return 0;
    }
  • 相关阅读:
    [转]select any dictionary与select_catalog_role区别
    [转]Oracle DB 权限与角色
    About Secure Application Roles
    [转]Oracle DB 用户
    [转]Oracle DB 管理数据库存储结构
    lsnrctl工具之service
    [转]Oracle DB 配置Oracle Network环境
    [转]Oracle DB 性能视图和数据字典
    [转]Oracle DB 查看预警日志
    判断数据库启动时使用的参数文件类型的方法
  • 原文地址:https://www.cnblogs.com/zhangjiuding/p/9121021.html
Copyright © 2020-2023  润新知