D. Lakes in Berland (DFS或者BFS +连通块
https://blog.csdn.net/guhaiteng/article/details/52730373 参考题解
http://codeforces.com/contest/723/problem/D 原题目
#include<iostream>
#include<cstdio>
#include <cctype>
#include<algorithm>
#include<cstring>
#include<cmath>
#include<string>
#include<cmath>
#include<set>
#include<vector>
#include<stack>
#include<queue>
#include<map>
using namespace std;
#define ll long long
#define mem(a,x) memset(a,x,sizeof(a))
#define se second
#define fi first
const int INF= 0x3f3f3f3f;
const int N=2e5+; int n,m,k;
char mp[][];
int vis[][]={},tian[]={};
int dx[]={,-,,},dy[]={,,,-};
int nn=,cnt=,flag=,num=; pair<int,int>v[]; bool cmp(pair<int,int> c ,pair<int,int> d)
{
return c.second<d.second;
} void dfs(int nx,int ny)
{
num++; //块数++
vis[nx][ny]=cnt; //是属于第几个块的 就涂第几种颜色
if(nx==n||nx==||ny==||ny==m) flag=; //如果是海,就不能记入v中
for(int i=;i<;i++)
{
int x=nx+dx[i],y=ny+dy[i];
if(x>n||x<||y<||y>m||mp[x][y]!='.'||vis[x][y]) continue;
dfs(x,y);
}
} int main()
{
cin>>n>>m>>k;
for(int i=;i<=n;i++)
scanf("%s",mp[i]+);
for(int i=;i<=n;i++)
{
for(int j=;j<=m;j++)
{
if(mp[i][j]=='.'&& vis[i][j]==)
{
num=; //这个块 有多大
flag=;
cnt++; //有几个联通块
dfs(i,j);
if(flag==) {
nn++;
v[nn].first=cnt;
v[nn].second=num;
}
}
}
}
sort(v+,v++nn,cmp); //升序
int ans=; //需要填的所有块的总大小 即总cell数
int u=;
int V=nn;
while(V>k)
{
V--;
ans+=v[u].second;
tian[ v[u].first ]=;//填的第几块连通的区域标记为1
u++;
} cout<<ans<<endl;
for(int i=;i<=n;i++)
{
for(int j=;j<=m;j++)
{
if( tian[ vis[i][j] ] ) //如果填的第vis[i][j]块的区域标记为1
cout<<'*'; //就填了
else cout<<mp[i][j];
}
cout<<endl;
}
}
BFS:
第一次先把湖找出来,并记录湖的大小,然后存在结构体node中,最后sort一下,把要填的湖再bfs一下把这个湖变成陆地。
#include<iostream>
#include<cstdio>
#include <cctype>
#include<algorithm>
#include<cstring>
#include<cmath>
#include<string>
#include<cmath>
#include<set>
#include<vector>
#include<stack>
#include<queue>
#include<map>
using namespace std;
#define ll long long
#define mem(a,x) memset(a,x,sizeof(a))
#define se second
#define fi first
const int INF= 0x3f3f3f3f;
const int N=2e5+; int n,m,k;
char mp[][];
int vis[][]={} ,vis2[][]={};
int dx[]={,-,,},dy[]={,,,-};
int nn=,cnt=,flag=,num=,ans=; struct node
{
int x,y,s;
}a,b,c[];
queue<node>q; bool cmp(node u,node v)
{
return u.s<v.s;
} void bfs(int nx,int ny)
{
a.x=nx;
a.y=ny;
vis[a.x][a.y]=;
if(a.x==||a.y==||a.x==n||a.y==m) flag=; //是海不是湖
q.push(a);
while(!q.empty())
{
a=q.front(); q.pop();
for(int i=;i<;i++)
{
b.x=a.x+dx[i];
b.y=a.y+dy[i];
if(b.x<||b.y<||b.x>n||b.y>m||mp[b.x][b.y]!='.'|| vis[b.x][b.y] )
continue;
vis[b.x][b.y]=; if(b.x==||b.y==||b.x==n||b.y==m) flag=; //是海不是湖
num++;
//cout<<num<<endl; q.push(b);
}
}
} void bfs2(int nx,int ny)
{
while(!q.empty()) q.pop();
a.x=nx;
a.y=ny;
vis2[a.x][a.y]=;
mp[a.x][a.y]='*';
ans++; //总数++
q.push(a);
while(!q.empty())
{
a=q.front(); q.pop();
for(int i=;i<;i++)
{
b.x=a.x+dx[i];
b.y=a.y+dy[i];
if(b.x<||b.y<||b.x>n||b.y>m||mp[b.x][b.y]!='.'|| vis2[b.x][b.y] )
continue; mp[b.x][b.y]='*';
vis2[b.x][b.y]=;
ans++;
q.push(b);
}
}
} int main()
{
cin>>n>>m>>k;
for(int i=;i<=n;i++)
scanf("%s",mp[i]+);
for(int i=;i<=n;i++){
for(int j=;j<=m;j++){
if(mp[i][j]=='.' && !vis[i][j])
{
num=;
flag=;
bfs(i,j);
if(!flag)
{
nn++;
c[nn].x=i; c[nn].y=j ; c[nn].s=num;
//cout<<i<<' '<<j<<endl;
//cout<<num<<endl;
//记录原始坐标和 这个块的格子数
}
}
}
}
sort(c+,c++nn,cmp); //升序 for(int i=;i<=nn-k ;i++) //开始填
{
bfs2(c[i].x, c[i].y); //这里开始的 一定是'.'
} cout<<ans<<endl;
for(int i=;i<=n;i++)
printf("%s\n",mp[i]+);
}
D. Lakes in Berland (DFS或者BFS +连通块的更多相关文章
- DFS or BFS --- 连通块
Oil Deposits Time Limit:1000MS Memory Limit:32768KB 64bit IO Format:%I64d & %I64 Descrip ...
- CF723D. Lakes in Berland[DFS floodfill]
D. Lakes in Berland time limit per test 2 seconds memory limit per test 256 megabytes input standard ...
- Codeforces Round #375 (Div. 2) D. Lakes in Berland dfs
D. Lakes in Berland time limit per test 2 seconds memory limit per test 256 megabytes input standard ...
- CodeForces 723D Lakes in Berland (dfs搜索)
题意:给定一个n*m的矩阵,*表示陆地, . 表示水,一些连通的水且不在边界表示湖,让你填最少的陆地使得图中湖剩下恰好为k. 析:很简单的一个搜索题,搜两次,第一次把每个湖的位置和连通块的数量记下来, ...
- codeforces 590C C. Three States(bfs+连通块之间的最短距离)
题目链接: C. Three States time limit per test 5 seconds memory limit per test 512 megabytes input standa ...
- 经典DFS问题 oilland 连通块
#include "iostream" #include "cstdio" using namespace std; ][]={{,},{,-},{,},{-, ...
- 题解报告:poj 2386 Lake Counting(dfs求最大连通块的个数)
Description Due to recent rains, water has pooled in various places in Farmer John's field, which is ...
- ZOJ 3781 Paint the Grid Reloaded(DFS连通块缩点+BFS求最短路)
题目链接:http://acm.zju.edu.cn/onlinejudge/showProblem.do?problemId=5268 题目大意:字符一样并且相邻的即为连通.每次可翻转一个连通块X( ...
- Codeforces 987 K预处理BFS 3n,7n+1随机结论题/不动点逆序对 X&Y=0连边DFS求连通块数目
A /*Huyyt*/ #include<bits/stdc++.h> #define mem(a,b) memset(a,b,sizeof(a)) #define pb push_bac ...
随机推荐
- 分布式消息通信之RabbitMQ_Note
目录 1. RabbitMQ 安装 2. RabbitMQ 应用场景,特性 3. 官网入门指引 4. RabbitMQ 工作模型 5. RabbitMQ 主要的几种交换机类型 6. Java API的 ...
- Windows Server 2012 R2蓝屏
最近发现某个医院客户Windows Server 2012 R2 DataCenter的系统频繁蓝屏重启,重启没过一天再一次出现,反反复复折腾好几天,提示信息ntoskrnl.exe.mssmbios ...
- 导航current背景
========================================简单一点的 var locationUrl = location.href.toLowerCase(); //导航cur ...
- 当后端返回的数据是以属性做开头,怎么用length取值
在我们前端开发中,一般需要的数据是分条的如 [{},{},{},{}] ,这样的数据方便我们用length取值,尤其是在表格中.在控制台看的时候能轻易的看出1 2 3 4条,但有时候后台返回的数据不是 ...
- [学习笔记] Blender 常用工具 移动与旋转,缩放, 变换
点击上面的移动图标之后,可在X,Y,Z轴移动物体. shift+S 之后,可有更多的移动选项. 旋转:可沿X,Y, Z 进行旋转 缩放 还可输入缩放的具体数值,更精确. 变换 可同时做移动.旋转.缩放 ...
- GitLab基本使用
一.引言 在微服务架构中,由于我们对系统的划分粒度足够小,服务会很多,而且也存在经常迭代的情况.如果还按照以前的部署方式显得非常吃力和复杂,并且很容易出现错误.而随着容器技术的发展,这个时候持续集成( ...
- chapter01图像基本操作
刚刚开始学习opencv,来记录一下自己的学习笔记,也向各位大牛虚心求教 一.图片的基本知识 只要是彩色的图片都有三个颜色通道,即RGB,用三个矩阵来表示. 三个矩阵的同一个坐标位置上的数值描述的是一 ...
- 笔记-6:mysql索引
1.索引概述 建立索引的目的:加快数据库检索的速度. mysql中索引主要分为: 普通索引:使用index或key关键字创建,其索引列值可以取空值或重复值. 唯一性索引:使用关键字UNIQUE创建,其 ...
- CentOS7离线安装Mysql(详细安装过程)
Mysql安装 下载mysql离线安装包 https://cdn.mysql.com//Downloads/MySQL-5.7/mysql-5.7.27-1.el7.x86_64.rpm-bundle ...
- python处理Excel文件的几个模块
在python中简单地处理excel文件,有几个相关的模块,各有千秋,本文将不定时收录. Python Excel网站收集了关于python处理excel文件的各种信息. [注意]使用python处理 ...