Codeforces Round #375 (Div. 2) D. Lakes in Berland DFS

D. Lakes in Berland

链接:

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

题意

给你一个n/*m的矩阵,然后你们有不少于k条湖泊,然后你需要使得一些湖泊变成陆地,使得湖泊的数量恰好等于k,问你至少填多少个水。

湖泊不与外界相邻。

题解:

直接dfs搜出每一条湖泊,然后放在优先队列里,从小到大去填满就好了。

代码:

 1 #include<iostream>
 2 #include<queue>
 3 #include<vector>
 4 #include<functional>
 5 using namespace std;
 6
 7 typedef pair<int, int> P;
 8 typedef pair<int, P> PP;
 9 const int maxn = 55;
10 char map[maxn][maxn];
11 int vis[maxn][maxn];
12 int dx[4] = { 1,0,-1,0 };
13 int dy[4] = { 0,1,0,-1 };
14 int n, m, sum, fg;
15 priority_queue<PP, vector<PP>, greater<PP> > lake;
16
17 void dfs(P s)
18 {
19     int x = s.first, y = s.second;
20     sum++;
21     vis[x][y] = 1;
22     if (x == 1 || x == n || y == 1 || y == m) fg = 0;
23     for (int i = 0; i < 4; i++)
24     {
25         int nx = x + dx[i];
26         int ny = y + dy[i];
27         if (nx < 1 || nx > n) continue;
28         if (ny < 1 || ny > m) continue;
29         if (map[nx][ny] == ‘*‘) continue;
30         if (vis[nx][ny]) continue;
31         dfs(P(nx, ny));
32     }
33 }
34
35 void dfs2(P s)
36 {
37     int x = s.first, y = s.second;
38     map[x][y] = ‘*‘;
39     for (int i = 0; i < 4; i++)
40     {
41         int nx = x + dx[i];
42         int ny = y + dy[i];
43         if (nx < 1 || nx > n)continue;
44         if (ny < 1 || ny > m)continue;
45         if (map[nx][ny] == ‘*‘)continue;
46         dfs2(P(nx, ny));
47     }
48 }
49
50 int main()
51 {
52     int k;
53     cin >> n >> m >> k;
54     for (int i = 1; i <= n; i++)
55         for (int j = 1; j <= m; j++)
56             cin >> map[i][j];
57     for (int i = 1; i <= n; i++)
58         for (int j = 1; j <= m; j++)
59             if (map[i][j] == ‘.‘ && vis[i][j] == 0) {
60                 fg = 1;
61                 sum = 0;
62                 dfs(P(i, j));
63                 if (fg) lake.push(PP(sum, P(i, j)));
64             }
65     int ans = 0;
66     while (lake.size() != k) {
67         ans += lake.top().first;
68         dfs2(lake.top().second);
69         lake.pop();
70     }
71     cout << ans << endl;
72     for (int i = 1; i <= n; i++) {
73         for (int j = 1; j <= m; j++)
74             cout << map[i][j];
75         cout << endl;
76     }
77     return 0;
78 }
时间: 2024-12-29 11:16:31

Codeforces Round #375 (Div. 2) D. Lakes in Berland DFS的相关文章

Codeforces Round #359 (Div. 2) C. Robbers&#39; watch (暴力DFS)

题目链接:http://codeforces.com/problemset/problem/686/C 给你n和m,问你有多少对(a, b) 满足0<=a <n 且 0 <=b < m 且a的7进制和n-1的7进制位数相同 且b的7进制和m-1的7进制位数相同,还有a和b的7进制上的每位上的数各不相同. 看懂题目,就很简单了,先判断a和b的7进制位数是否超过7,不超过的话就dfs暴力枚举计算就可以了. 1 //#pragma comment(linker, "/STACK

Codeforces Round #375 (Div. 2) ABCDE

A - The New Year: Meeting Friends 水 #include<iostream> #include<algorithm> using namespace std; int main() { int a,b,c; cin>>a>>b>>c; cout<<max(a,max(b,c)) - min(a,min(b,c)) <<endl; return 0; } B - Text Document A

Codeforces Round #375 (Div. 2) A

Description There are three friend living on the straight line Ox in Lineland. The first friend lives at the point x1, the second friend lives at the point x2, and the third friend lives at the point x3. They plan to celebrate the New Year together,

Codeforces Round #375 (Div. 2)

这是我打的第一场现场CF,才涨了4分= =,太菜啦.. 第一题,超级大水题,不说了.. 第二题,也挺水的,要注意的是,最后一个字符如果不是下划线或者括号结束的话,仍然要判断那个单词.因为这点WA了好多次. 第三题,rejudge的时候错了= =..题目意思有点晦涩,其实还是比较水的题,题目要求前m个组合唱的歌的数目的最小值要最大,那么这个最大值很显然是n/m,向下取整,然后从1遍历到n,如果数字大于m的或者小于等于m但是其出现的次数过多的(大于n/m)都把它变成不足n/m次的数字,然后我当时因为

Codeforces Round #375 (Div. 2) B

Description Modern text editors usually show some information regarding the document being edited. For example, the number of words, the number of pages, or the number of characters. In this problem you should implement the similar functionality. You

Codeforces Round #375 (Div. 2) C

Description Polycarp is a music editor at the radio station. He received a playlist for tomorrow, that can be represented as a sequence a1, a2, ..., an, where ai is a band, which performs the i-th song. Polycarp likes bands with the numbers from 1 to

Codeforces Round #375 (Div. 2)E. One-Way Reform

题目链接:传送门 题目大意:一副无向图,要求你给边定向(变为有向图),使出度等于入度的点最多,输出有多少 个点,并且输出定向后的边(前为起点,后为终点) 题目思路:欧拉路 我们这样考虑,先考虑无向图的点的度数,如果为奇数则一定无法变为题目要求的点,ans-1 对于度为偶数的点则一定可以通过调整满足. 处理方法:新建一个虚拟节点0,使所有度为奇数的点向其连一条边,那么最终图中的点的度数都为偶数. 这样就满足欧拉路的条件了.我们只需要跑欧拉路并且将走过的路径保留下来即可. 注意将与虚拟节点连的边删去

Codeforces Round #375 (Div. 2) A B C D F

A 数轴上有三个人要到一个点去过年 使三个人走路距离的和最小  让两边的人都走到中间那个点即可 B 给出一个字符串 其中有_ ( ) 三种字符和英文字母 连续的英文字母是一个单词 括号对中不会套括号对 求 括号外最长的单词长度 括号内有多少单词 维护一个bool变量表示当前单词在不在括号内 res表示当前单词的长度 可见 _() 都是分隔符 C 给出一个节目表 其中有n个曲目 每一个ai 代表这个曲目由ai乐队演奏 但是某人只喜欢标号是1-m的乐队 现在他可以对每个节目的乐队进行更换 问 最少更

Codeforces Round #200 (Div. 1) D. Water Tree(dfs序加线段树)

思路: dfs序其实是很水的东西.  和树链剖分一样, 都是对树链的hash. 该题做法是:每次对子树全部赋值为1,对一个点赋值为0,查询子树最小值. 该题需要注意的是:当我们对一棵子树全都赋值为1的时候, 我们要查询一下赋值前子树最小值是不是0, 如果是的话, 要让该子树父节点变成0, 否则变0的信息会丢失. 细节参见代码: #include <cstdio> #include <cstring> #include <algorithm> #include <i