Date:2022.01.19
题意:给定n*m的岛,’.‘表示此处为水,连着的水为湖。连着边界的所有水为海,不算入湖。给定k,要求保留k个湖,至少需要填多少格像’.‘这样水,并输出填湖之后的岛。

思路:先预处理所有连着海的点,都不算入湖。之后找到每个未被访问的点,dfs1找到它所在的连通块标记并为访问过。之后每个连通块取一个代表,bfs版Floodfill找到每个连通块的大小,加入vector中排序,保留最大的k个,其余算累加即为需要填补的’.'的数量;再找到需要的连通块,dfs2填上每个坑输出。(直接莽的确实太乱了)
代码如下:

#include <iostream>
#include <cstring>
#include <algorithm>
#include <queue>
using namespace std;
const int N = 55;
typedef long long LL;
typedef pair<int, int> PII;
LL n,m,k;
LL a[N][N];
bool st[N][N];
char c[N][N];
int dx[4] = {-1, 0, 1, 0}, dy[4] = {0, 1, 0, -1};
void dfs1(LL x,LL y)
{if(c[x][y]=='.') st[x][y]=true;for(int i=0;i<4;i++){LL ix=x+dx[i],iy=y+dy[i];if(ix<=0||iy<=0||ix>n||iy>m||c[ix][iy]=='*'||st[ix][iy]) continue;st[ix][iy]=true;dfs1(ix,iy);}
}
void dfs2(LL x,LL y)
{if(c[x][y]=='.') c[x][y]='*';for(int i=0;i<4;i++){LL ix=x+dx[i],iy=y+dy[i];if(ix<=0||iy<=0||ix>n||iy>m||c[ix][iy]=='*')continue;c[ix][iy]='*';dfs2(ix,iy);}
}
LL bfs(LL x,LL y)
{queue<PII>q;LL area=0;q.push({x,y});st[x][y]=true;while(q.size()){PII t=q.front();q.pop();area++;for(int i=0;i<4;i++){LL ix=t.first+dx[i],iy=t.second+dy[i];if(ix<=0||iy<=0||ix>n||iy>m||c[ix][iy]=='*'||st[ix][iy])continue;q.push({ix,iy});st[ix][iy]=true;}}return area;
}
int main()
{ios::sync_with_stdio(false);cin.tie(0);cout.tie(0);cin>>n>>m>>k;vector<PII>v;for(int i=1;i<=n;i++)for(int j=1;j<=m;j++){cin>>c[i][j];if((i==1||i==n)&&c[i][j]=='.') v.push_back({i,j});if((j==1||j==m)&&c[i][j]=='.') v.push_back({i,j});}for(int i=0;i<v.size();i++){LL x=v[i].first,y=v[i].second;if(st[x][y]) continue;dfs1(x,y);}v.clear();for(int i=1;i<=n;i++)for(int j=1;j<=m;j++)if(!st[i][j]&&c[i][j]=='.')v.push_back({i,j});LL maxx=0;queue<LL>qq;vector<LL>v1;vector<PII>v2;for(int i=0;i<v.size();i++){LL x=v[i].first,y=v[i].second;if(!st[x][y] && c[x][y]=='.'){LL ans=bfs(x,y);a[x][y]=ans;v1.push_back(ans);v2.push_back({x,y});}}LL num=0,res=0;sort(v1.begin(),v1.end());for(int i=0;i<v1.size();i++) {if(i<v1.size()-k) res+=v1[i];qq.push(v1[i]);}LL ss=qq.size();//几个湖memset(st,false,sizeof st);while(qq.size()){LL t=qq.front();qq.pop();bool flag=false;for(int i=1;i<=n;i++){for(int j=1;j<=m;j++)if(a[i][j]==t && !st[i][j]){dfs2(i,j);st[i][j]=true;flag=true;num++;break;}if(flag || num==ss-k) break;}}cout<<res<<endl;for(int i=1;i<=n;i++){for(int j=1;j<=m;j++) cout<<c[i][j];cout<<endl;}return 0;
}

cf723 Round #375 Div2-D【Floodfill+搜索】相关推荐

  1. Codeforces Round#310 div2

    C题:这题说的是套娃,如果做题的时候知道是套娃,那就好理解多了 规则1:套娃A可以放到套娃B里面,当且仅当套娃B没有放在其他套娃里面 规则2:套娃A放在套娃B里面,且套娃B没有放在其他套娃里面,那么可 ...

  2. Codeforces Round #327 div2

    Problem_A(591A): 题意: 有一段长度为l的路,两个人分别在两个端点,1, l. 现在已知每个人的速度为p,q. 求第一个人(初始位置在1)在他们第二次相遇的时候的位置. 当他们相遇的时 ...

  3. CF Round #679 div2赛后总结

    前言 好不容易遇到一次简单的div2,竟然才A了三题,可恶的第4题,死活调不出来QAQ. 比赛地址 A 题意:给你TTT组数据,每组数据nnn个整数(nnn是偶数),分别为a1,a2,...,ana_ ...

  4. codeforces round 416 div2补题

    第一题,水题 A. Vladik and Courtes #include<bits/stdc++.h> using namespace std; int main() {long lon ...

  5. codeforces round 421 div2 补题 CF 820 A-E

    A Mister B and Book Reading  O(n)暴力即可 #include<bits/stdc++.h> using namespace std; typedef lon ...

  6. 【Codeforces】Round #375 (Div. 2)

    Position:http://codeforces.com/contest/723 我的情况 啊哈哈,这次raiting肯定要涨,接受过上次的教训,先用小号送肉,大号都是一发切,重回蓝咯 结果... ...

  7. codeforces round #576 div2 D Welfare State(线段树)[单点修改+区间修改]

    题意:有一些数字,以及一些操作.操作一是单点修改,输入1 b c,将位置b改成c,操作二是输入2 a,将不大于a的数全部改成a.求更改完毕后的数. tag的运用:tag是对被覆盖区间上加一个标记,那么 ...

  8. cf round #421 div2 D. Mister B and PR Shifts

    链接:http://codeforces.com/contest/820/problem/D 分析:|p[i]-i|每次只会变化1,先不考虑端点情况,就只有p[i]==i的时候变化,每次k+1的时候, ...

  9. Codeforces Round #375 (Div. 2)

    这是我打的第一场现场CF,才涨了4分= =,太菜啦.. 第一题,超级大水题,不说了.. 第二题,也挺水的,要注意的是,最后一个字符如果不是下划线或者括号结束的话,仍然要判断那个单词.因为这点WA了好多 ...

最新文章

  1. 迪士尼研究院等将人造“神经纤维”用于软体机器人,赋予其“本体感知能力”!...
  2. 与servlet Api 的集成
  3. 神策数据:从产品与运营视角,了解教育行业转介绍
  4. linux diff命令_Linux diff命令示例
  5. python中range什么意思_python里range什么意思
  6. mysql从dos界面_从DOS界面进入MYSQL数据库
  7. 背景图层和普通图层的区别_008Photoshop四赞图层(图层样式)
  8. 全球首个由AI鉴定保驾护航的B2B奢侈品潮品交易平台图灵云仓上线
  9. apple color emoji_emoji的7个冷知识
  10. 你遇到过最有诗意的句子是什么?
  11. 正则表达式re.S的用法
  12. python热度评价指标_编程语言流行指数四月榜单发布:Python 持续强势,Java 热度减退...
  13. SQL问题记录——Unable to connect SqlServer Oledb ...
  14. 基于springboot人事管理系统设计与实现
  15. Windows系统以及office等一键激活
  16. Vue事件修饰符——.prevent 和.passive
  17. 分手后怎样才能让前任重回你身边
  18. 202五一杯数学建模ABC三题
  19. Personalized Re-ranking for Recommendation
  20. 【2021】13 年终总结

热门文章

  1. 第六章 Linux 文件与目录配置
  2. 公交查询系统的设计之详细设计程序流程图(2)
  3. 13.网络爬虫—多进程详讲(实战演示)
  4. Debian10 上实现dns-CA+apache服务
  5. geohash算法原理及实现方式
  6. 乐视网:归还民生信托9亿资金来源与贾跃亭及上市公司无关
  7. HTML5将要统治世界!这是真的吗?
  8. 深入理解 iTunes:原理和同步
  9. “倒在”金三银四,大牛手把手带你
  10. 【c语言五子棋】自定义类型五子棋/井字棋:胜负判断