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 ...
随机推荐
- (CVE-2016-5195)脏牛本地提权
简要分析 该漏洞具体为,get_user_page内核函数在处理Copy-on-Write(以下使用COW表示)的过程中,可能产出竞态条件造成COW过程被破坏, 导致出现写数据到进程地址空间内只读内存 ...
- 解决安装eclipse时出现"Failed to load JNI shared library"
下午远程帮别人弄了很久的eclipse,安装时老是出现如图的字样 最后在安装配置文件中找到问题所在,这个最新版本的eclipse需要jdk1.8的环境,由于系统的jdk是1.7,版本过低从而导致安装失 ...
- 最新 小红书java校招面经 (含整理过的面试题大全)
从6月到10月,经过4个月努力和坚持,自己有幸拿到了网易雷火.京东.去哪儿.小红书等10家互联网公司的校招Offer,因为某些自身原因最终选择了小红书.6.7月主要是做系统复习.项目复盘.LeetCo ...
- abp(net core)+easyui+efcore
abp(net core)+easyui+efcore实现仓储管理系统——展现层实现增删改查之控制器(六) abp(net core)+easyui+efcore实现仓储管理系统目录 abp(ne ...
- 如何创建一个线程安全的Map?
1,使用普通的旧的Hashtable HashMap允许null作为key,而Hashtable不可以 2,使用Collections中同步化的包装方法synchronizedMap 3,使用conc ...
- php 的 socket简单原理及实现
什么是socket socket:网络上的两个程序通过一个双向的通信连接实现数据的交换,连接的一端称为一个socket. 因此socket运行是置少有2个端组成,一个为服务端一个为客户端(客户端可以多 ...
- 扩展Asp.Net Core中的IdentityUser类
虽然Asp.Net Core.Identity提供了IdentityUser类,但是在有些情况下我们需要一些额外的用户信息,比如性别,年龄等,这时候就需要来扩展IdentityUser类以达到我们的需 ...
- knox 编译 源码
1. git clone https://gitbox.apache.org/repos/asf/knox.git cd knox mvn clean install https://cwiki.ap ...
- Django 关联查询
查询id=1的XXXXX关联的YYYYY信息 a = XXXXX.objects.get(id=1) a.YYYYY.all() 查询id=1的YYYYY关联的XXXXX信息 b = YYYYY.ob ...
- python之SQLite笔记
sqlite3 打开文件并创建游标 conn = sqlite3.connect('adressbook.db')c = conn.cursor() 连接对象:sqlite3.connect('数据文 ...