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 ...
随机推荐
- 【web 安全测试思路】图形验证码对服务器的影响
前言 图片验证码是为了防止恶意破解密码.刷票.论坛灌水等才出现的,但是你有没有想过,你的图形验证码竟然可能导致服务器的崩溃? 利用过程 这里以phpcms为例,首先需要找一个图形验证码. 将图片拖动到 ...
- 【馨儿收藏】群星《2019最新好听DJ舞曲精选》全系列【WAV/在线/百度】(持续更新)
本人作为一名音乐发烧友,一直喜欢追求无损音乐,平时在开发编程无聊的时候,希望享受音乐的过程,追求完美,我这边整理了一系列的比较不错,新的好听的无损音乐,希望大家能够喜欢. [馨儿收藏]群星<20 ...
- MATLAB知识-解决因缺少libsvm 而运行出现Y must be a vector or a character array.
matlab版本R2014b 最近运行一个使用svmtrain的程序,出现以下错误: 这是因为是在设定路径里面没有libsvm.辛亏有一位师姐的电脑里面有libsvm的包,我直接用了,这样就不需要下载 ...
- Rhino脚本引擎技术介绍
引用:http://p.primeton.com/articles/54c1e255be20aa4735000001 http://blog.csdn.net/u013292493/article/d ...
- Linux 时间以及时间间隔的简单处理.
最近想知道自己的一个部署脚本的耗时, 中午时间看了一下最简单的Linux 时间函数的处理 我这里的处理非常简单, 仅仅是够用而已. 处理过程. 1. 获取当前时间: time1=`date` 或者是 ...
- windows使用sqlpus连接oracle 数据库
1.先安装好Instant Client程序. 2.打开cmd 执行sqlplus命令,如果出现如下图 2.说明需要把oracle install 的bin目类 添加系统环境path中,如下图添加环境 ...
- 快速创建一个SpringBoot项目并整合Mybatis
2019-09-15 一.Maven环境搭建 1.导入jar坐标 <project xmlns="http://maven.apache.org/POM/4.0.0" xml ...
- Linux下的静态库与动态库的生成与调用
静态库与动态库 静态函数库 这类库的名字一般是libxxx.a,xxx为库的名字.利用静态函数库编译成的文件比较大,因为整个函数库的所有数据都会被整合进目标代码中,他的优点就显而易见了,即编译后的执行 ...
- ESP32 - 乐鑫官方Flash烧录工具使用
第一步:打开软件flash_download_tools_v3.6.6.exe 第二步:点击ESP32 DownloadTool,启动我们板子的烧录工具 第三步:按照下图顺序,加载bin_prog目录 ...
- Codeforces Round #557 Div. 1 based on Forethought Future Cup - Final Round
A:开场就读错题.读对了之后也没啥好说的. #include<bits/stdc++.h> using namespace std; #define ll long long #defin ...