题目链接:http://codeforces.com/contest/723/problem/D

题意:给定n*m小大的字符矩阵。'*'表示陆地,'.'表示水域。然后湖的定义是:如果水域完全被陆地包围则称为湖。 海的定义:如果水域与任何一个边界的水域有连通则陈伟海。现在要求填一些湖使得最后湖的数量恰好等于K.输出最小要填多少个单位的'.'水域和最终填完之后的字符矩阵。

思路:水题。注意本题的连通是四个方向[上下左右],然后dfs每一个连通块,对于每个连通块我们维护2个值:水域的数目和连通块属于海还是湖。 假装最终一共有x个湖。则要填(x-k)个湖。所以对于湖我们找水域最小的哪些连通块来填。

#define _CRT_SECURE_NO_DEPRECATE
#include<stdio.h>
#include<string.h>
#include<cstring>
#include<algorithm>
#include<queue>
#include<math.h>
#include<time.h>
#include<map>
#include<vector>
#include<iostream>
using namespace std;
typedef long long int LL;
const int INF = 0x3f3f3f3f;
 + ;
int n, m, k, vis[MAXN][MAXN], id;
char G[MAXN][MAXN];
][] = { , , , -, , , -,  };
struct Node{
    int cnt; //水域数目
    bool flag; //true: 海  false:湖
}sea[MAXN*MAXN];
bool check(int x, int y){ //是否越界
     && x<n&&y >=  && y<m;
}
void dfs(int x, int y){
    int nextx, nexty;
    ; i<; i++){
        nextx = x + dist[i][];
        nexty = y + dist[i][];
        if (check(nextx, nexty) && G[nextx][nexty] != '*'&&!vis[nextx][nexty]){
            vis[nextx][nexty] = id; sea[id].cnt++;
             || nextx == n -  || nexty ==  || nexty == m - ){
                sea[id].flag = true; //连通块包括边界。属于海
            }
            dfs(nextx, nexty);
        }
    }
}
int main(){
    while (~scanf("%d%d%d", &n, &m, &k)){
        ; i<n; i++){
            scanf("%s", G[i]);
        }
        memset(vis, , ;
        ; i<n; i++){
             || i == n - ){ continue; }
            ; j<m; j++){
                 || j == m - ){ continue; }
                if (G[i][j] == '.'&&!vis[i][j]){
                    sea[id].cnt = ; sea[id].flag = false;
                    vis[i][j] = id; dfs(i, j); id++;
                }
            }
        }
        ;//统计有多少湖
        ; i<id; i++){
            if (sea[i].flag == false){
                totk++;
            }
        }
        ;  //统计要填多少单位的水域
        for (; totk>k; totk--){
            ;
            ; i<id; i++){//枚举每一个连通块,
                if (sea[i].flag == false){//选择湖中水域最小的湖来填
                    if (sea[i].cnt<minval){
                        minval = sea[i].cnt;  minid = i;
                    }
                }
            }
            ans += minval; sea[minid].flag = true; //填完的湖标记一下。
            ; i<n; i++){
                ; j<m; j++){
                    if (vis[i][j] == minid){ //找到要填的湖的连通分量
                        G[i][j] = '*';
                    }
                }
            }
        }
        printf("%d\n", ans);
        ; i<n; i++){
            printf("%s\n", G[i]);
        }
    }
    ;
}

Codeforces Round #375 (Div. 2) - D的更多相关文章

  1. Codeforces Round #375 (Div. 2) - C

    题目链接:http://codeforces.com/contest/723/problem/C 题意:给定长度为n的一个序列.还有一个m.现在可以改变序列的一些数.使得序列里面数字[1,m]出现次数 ...

  2. Codeforces Round #375 (Div. 2) - B

    题目链接:http://codeforces.com/contest/723/problem/B 题意:给定一个字符串.只包含_,大小写字母,左右括号(保证不会出现括号里面套括号的情况),_分隔开单词 ...

  3. Codeforces Round #375 (Div. 2) - A

    题目链接:http://codeforces.com/contest/723/problem/A 题意:在一维坐标下有3个人(坐标点).他们想选一个点使得他们3个到这个点的距离之和最小. 思路:水题. ...

  4. Codeforces Round #375 (Div. 2) F. st-Spanning Tree 生成树

    F. st-Spanning Tree 题目连接: http://codeforces.com/contest/723/problem/F Description You are given an u ...

  5. Codeforces Round #375 (Div. 2) E. One-Way Reform 欧拉路径

    E. One-Way Reform 题目连接: http://codeforces.com/contest/723/problem/E Description There are n cities a ...

  6. Codeforces Round #375 (Div. 2) D. Lakes in Berland 贪心

    D. Lakes in Berland 题目连接: http://codeforces.com/contest/723/problem/D Description The map of Berland ...

  7. Codeforces Round #375 (Div. 2) B. Text Document Analysis 模拟

    B. Text Document Analysis 题目连接: http://codeforces.com/contest/723/problem/B Description Modern text ...

  8. Codeforces Round #375 (Div. 2) A. The New Year: Meeting Friends 水题

    A. The New Year: Meeting Friends 题目连接: http://codeforces.com/contest/723/problem/A Description There ...

  9. Codeforces Round #375 (Div. 2) Polycarp at the Radio 优先队列模拟题 + 贪心

    http://codeforces.com/contest/723/problem/C 题目是给出一个序列 a[i]表示第i个歌曲是第a[i]个人演唱,现在选出前m个人,记b[j]表示第j个人演唱歌曲 ...

随机推荐

  1. SQL Server如何在变长列上存储索引

    这篇文章我想谈下SQL Server如何在变长列上存储索引.首先我们创建一个包含变长列的表,在上面定义主键,即在上面定义了聚集索引,然后往里面插入80000条记录: -- Create a new t ...

  2. iOS调用系统的电话功能

    NSString *allString = [NSString stringWithFormat:@"tel:10086"];//注意电话号码不能包含空格,包含空格的电话号码拨打没 ...

  3. 股票k线

    与上一篇文章相比k线图主要的难点 1.tooltip的定制化显示: 当手指触摸手机屏幕上下拖动可能会手指的事件陷入图表无法进行上下拖动 tooltip:{followMouseMove} follow ...

  4. Qt的进度条设置

    progress bar 颜色设置 QProgressBar {   border: 2px solid grey;   border-radius: 5px;   background-color: ...

  5. Android String format 通过value 下的string.xml 文件

    <string name="format_coordinate" formatted="false">%s %d° %d\' %d\" % ...

  6. ftk学习记(icon篇)

    [声明:版权全部,欢迎转载.请勿用于商业用途.  联系信箱:feixiaoxing @163.com] 在開始今天的文章之前.我们还是先看一下上一节的效果图. 大家能够參照上一节的解说,是不是存在这种 ...

  7. 写20万数据到Excel只需9秒

    on my god,写20万数据到Excel只需9秒   还是菜鸟时,在某个.Net项目中,用户需要从业务系统导出Report,而数据量通常都在上万条以上,最初采用的方式就是在服务器端用NPOI生成E ...

  8. hdu_1506:Largest Rectangle in a Histogram 【单调栈】

    题目链接 对栈的一种灵活运用吧算是,希望我的注释写的足够清晰.. #include<bits/stdc++.h> using namespace std; typedef long lon ...

  9. .net core读取json配置文件

    一.新建.net core控制台程序 二.通过Nuget引入 Microsoft.Extensions.Configuration和microsoft.extensions.configuration ...

  10. 【原创】uC/OS II 任务切换原理

    今天学习了uC/OS II的任务切换,知道要实现任务的切换,要将原先任务的寄存器压入任务堆栈,再将新任务中任务堆栈的寄存器内容弹出到CPU的寄存器,其中的CS.IP寄存器没有出栈和入栈指令,所以只能引 ...