cf723 Round #375 Div2-D【Floodfill+搜索】
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+搜索】相关推荐
- Codeforces Round#310 div2
C题:这题说的是套娃,如果做题的时候知道是套娃,那就好理解多了 规则1:套娃A可以放到套娃B里面,当且仅当套娃B没有放在其他套娃里面 规则2:套娃A放在套娃B里面,且套娃B没有放在其他套娃里面,那么可 ...
- Codeforces Round #327 div2
Problem_A(591A): 题意: 有一段长度为l的路,两个人分别在两个端点,1, l. 现在已知每个人的速度为p,q. 求第一个人(初始位置在1)在他们第二次相遇的时候的位置. 当他们相遇的时 ...
- CF Round #679 div2赛后总结
前言 好不容易遇到一次简单的div2,竟然才A了三题,可恶的第4题,死活调不出来QAQ. 比赛地址 A 题意:给你TTT组数据,每组数据nnn个整数(nnn是偶数),分别为a1,a2,...,ana_ ...
- codeforces round 416 div2补题
第一题,水题 A. Vladik and Courtes #include<bits/stdc++.h> using namespace std; int main() {long lon ...
- 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 ...
- 【Codeforces】Round #375 (Div. 2)
Position:http://codeforces.com/contest/723 我的情况 啊哈哈,这次raiting肯定要涨,接受过上次的教训,先用小号送肉,大号都是一发切,重回蓝咯 结果... ...
- codeforces round #576 div2 D Welfare State(线段树)[单点修改+区间修改]
题意:有一些数字,以及一些操作.操作一是单点修改,输入1 b c,将位置b改成c,操作二是输入2 a,将不大于a的数全部改成a.求更改完毕后的数. tag的运用:tag是对被覆盖区间上加一个标记,那么 ...
- 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的时候, ...
- Codeforces Round #375 (Div. 2)
这是我打的第一场现场CF,才涨了4分= =,太菜啦.. 第一题,超级大水题,不说了.. 第二题,也挺水的,要注意的是,最后一个字符如果不是下划线或者括号结束的话,仍然要判断那个单词.因为这点WA了好多 ...
最新文章
- 迪士尼研究院等将人造“神经纤维”用于软体机器人,赋予其“本体感知能力”!...
- 与servlet Api 的集成
- 神策数据:从产品与运营视角,了解教育行业转介绍
- linux diff命令_Linux diff命令示例
- python中range什么意思_python里range什么意思
- mysql从dos界面_从DOS界面进入MYSQL数据库
- 背景图层和普通图层的区别_008Photoshop四赞图层(图层样式)
- 全球首个由AI鉴定保驾护航的B2B奢侈品潮品交易平台图灵云仓上线
- apple color emoji_emoji的7个冷知识
- 你遇到过最有诗意的句子是什么?
- 正则表达式re.S的用法
- python热度评价指标_编程语言流行指数四月榜单发布:Python 持续强势,Java 热度减退...
- SQL问题记录——Unable to connect SqlServer Oledb ...
- 基于springboot人事管理系统设计与实现
- Windows系统以及office等一键激活
- Vue事件修饰符——.prevent 和.passive
- 分手后怎样才能让前任重回你身边
- 202五一杯数学建模ABC三题
- Personalized Re-ranking for Recommendation
- 【2021】13 年终总结