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 ...
随机推荐
- 创建.Net Core For WPF项目并且添加VS Code编译运行支持
1.下载最新的Visual Studio 2019或者Preview版本,新建项目,找到"WPF App(.Net Core)"模板. 2.输入项目名称"NetCore- ...
- 學校 iPad 使用學校google帳號登入Google Drive 提示"裝置政策提醒"的解決方法
因爲學校iPad 是給學生和老師使用,大多數是不需要設置鎖屏密碼的,然後 Gsuite 默認是開啓 “行動管理服務” 的策略為基本,就是需要設備設置鎖屏密碼以保障資料安全,不那麽容易被竊取. 然後就出 ...
- 性能测试loadrunner11工具再也不用担心浏览器兼容的问题了(目前试过的各版本浏览器都是成功的)
工具:Loadrunner 11.0+Fiddler+浏览器(谷歌.火狐.IE等) 步骤一:查看抓包工具Fiddler对应的端口 1.打开Fiddler------工具------选项-----连接, ...
- 【数据库开发】windows环境下通过c++使用redis
1.Windows下Redis的安装使用 Redis是一个key-value存储系统.Redis的出现,很大程度补偿了memcached这类key/value存储的不足,在部 分场合可以对关系数据库起 ...
- angular入门 - 环境安装及项目创建
1.安装node.js 下载,安装,在终端测试安装是否成功:node -v(查看nodejs版本) npm -v(查看npm版本) 下载地址:https://nodejs.org/en/downloa ...
- web前端三大主流框架的对比
MVX框架模式:MVC+MVP+MVVM 1.MVC:Model(模型)+View(视图)+controller(控制器),主要是基于分层的目的,让彼此的职责分开. View通过Controller来 ...
- 《ucore lab1 exercise3》实验报告
资源 ucore在线实验指导书 我的ucore实验代码 题目:分析bootloader进入保护模式的过程 BIOS将通过读取硬盘主引导扇区到内存,并转跳到对应内存中的位置执行bootloader.请分 ...
- 一个后端开发者的前端语言基础:JavaScript
JavaScript (一) 基本概述 (1) 概述 JavaScript一种直译式脚本语言,是一种动态类型.弱类型.基于原型的语言,内置支持类型.它的解释器被称为JavaScript引擎,为浏览器的 ...
- sqlite lib导入
依赖 1.System.Data.SQLite 2.SqlKata //https://www.nuget.org/profiles/SQLite //http://system.data.sqlit ...
- TCP状态转换(图解+文字解说)
<深入分析 javaweb 技术内幕>P38 读书扩展 作者:淮左白衣 写于2018年4月12日20:58:36 目录 TCP状态转换图解 图解三次握手 文字讲解三次握手: 图解四次挥手 ...