题意:给你一张n×m的图,点代表水,星代表地,当水连在一块时,称为湖,但是,若湖中有水在边界上,则不算它是湖,现在要求你去掉x个湖,并用地将其填上,使原图剩下k个湖,输出你最少需要多少个单位的地,并且输出你填补过的图。

比赛的时候没过,好菜呀。

思路:首先定义两个数组bfs_vis,dfs_vis,分别记录bfs和dfs的访问状况,定义flag,true代表一块区域属于湖,false代表一块区域不属于湖,vector[top]记录第top个湖内的点的情况,top初始化为0。

然后说下dfs的思路,从一个'.'点出发,并且只走'.',若其走到了边界上,则标记flag为false,此时并不结束dfs,而是继续走,将这一整块水域全部走完,并且dfs_vis都标记为true代表已经走过。相反,若走不到边界上,则一定能走完这个水域,flag为true,在dfs的同时,将走过的每一个点都装入vec[top]。当dfs完成后,若flag为false,则清空vec[top],否则top++,进入下个vec[top]记录新的湖。

然后说bfs,就是从(1,1)开始遍历,若找到一个点'.',并且其dfs_vis为false的话,说明它没有在dfs中被访问过,则对其进行dfs,当dfs完成后,若flag为true,说明这个点所在水域为湖,则记录它的大小和序号。

最后只要对这些湖的大小进行升序排序,并且相应的将其中的点填上就行了。


为什么这么强调dfs_vis呢,因为我就坑在这啦,最开始的时候,我在dfs中一旦发现某个点走到了边界就立即停止dfs并返回false,这样出现的问题就是当一个水域只有一个点在边界的时候,假如我们第一次就dfs到了改点,那么就相当于将其变成了陆地。则其剩下的水域在下一次dfs的时候就会被判定为一个湖。

代码:

#include<bits/stdc++.h>
#define MEM(a,x) memset(a,x,sizeof(a));
#define MEMINF(a) memset(a,0x3f,sizeof(a));
using namespace std;
typedef long long LL;
const int MAXN=4000;
const int INF=0x3f3f3f3f;
const int MOD=1000000007;
int n,m,k;
char mp[MAXN][MAXN];
int dx[]={0,0,1,-1};
int dy[]={1,-1,0,0};
int top;
struct node {int x,y;
};
bool bfs_vis[MAXN][MAXN];
bool dfs_vis[MAXN][MAXN];
bool cmp(node a,node b) {return a.x<b.x;
}vector<node>que;
queue<node>q;
vector<node> vec[MAXN];
bool flag;
void dfs(node u) {vec[top].push_back(u);dfs_vis[u.x][u.y]=1;if (u.x==1||u.x==n||u.y==1||u.y==m) flag=false;for (int i=0; i<4; ++i) {node v=u;v.x+=dx[i];v.y+=dy[i];if (dfs_vis[v.x][v.y])continue;if (mp[v.x][v.y]!='.') continue;//printf("%d %d\n",v.x,v.y);if (v.x==1||v.x==n||v.y==1||v.y==m) flag=false;dfs(v);}
}void bfs(){node u;u.x=1,u.y=1;q.push(u);bfs_vis[1][1]=1;MEM(bfs_vis,0);while(!q.empty()) {node no=q.front();q.pop();//printf("m %c %d\n",mp[4][3],!dfs_vis[4][3]);if (mp[no.x][no.y]=='.'&&!dfs_vis[no.x][no.y]) {flag=true;//puts("-----");dfs(no);if (flag) {//printf("no:%d %d\n",no.x,no.y);//puts("*****");node lal;lal.x=vec[top].size();lal.y=top;que.push_back(lal);top++;}else {vec[top].clear();}}for (int i=0; i<4; ++i) {node v=no;v.x+=dx[i];v.y+=dy[i];if (bfs_vis[v.x][v.y])continue;if (v.x<1||v.x>n||v.y<1||v.y>m) continue;q.push(v);bfs_vis[v.x][v.y]=1;}}
}int main() {scanf("%d %d %d",&n,&m,&k);top=0;for (int i=1; i<=n; ++i) {scanf("%s",mp[i]+1);}bfs();//printf("MAP%ld\n",que.size());int sum=0;sort(que.begin(),que.end(),cmp);for (auto i=0; i<top-k; ++i) {sum+=que[i].x;int num=que[i].y;for (int it=0;it<vec[num].size(); ++it) {int x=vec[num][it].x;int y=vec[num][it].y;mp[x][y]='*';}}printf("%d\n",sum);for (int i=1; i<=n; ++i) puts(mp[i]+1);}

codeforces#375(div.2)723D - Lakes in Berland dfs+bfs相关推荐

  1. CodeForces - 723D Lakes in Berland dfs

    Description The map of Berland is a rectangle of the size n × m, which consists of cells of size 1 × ...

  2. cf 723D Lakes in Berland(dfs)

    D. Lakes in Berland time limit per test 2 seconds memory limit per test 256 megabytes input standard ...

  3. Codeforces Round #777 (Div. 2) 简训

    Codeforces Round #777 (Div. 2) 简训 导语 涉及的知识点 题目 A Madoka and Math Dad B Madoka and the Elegant Gift C ...

  4. 水平导航菜单(DIV+CSS)

    水平导航菜单(DIV+CSS) 完全用DIV+CSS做的菜单,相比传统用图片做的打开速度更快.预览最终效果>> #nav{height: 44px;width: 425px;backgro ...

  5. 【汇编语言】除法(DIV/IDIV)

    除法(DIV/IDIV) 目录 除法(DIV/IDIV) `DIV`(unsigned divide)无符号数除法 `IDIV`(signed divide)有符号数除法 DIV(unsigned d ...

  6. 拓扑排序(Topological Sorting):Kahn 算法和 DFS 算法

    拓扑排序(Topological Sorting):Kahn 算法和 DFS 算法 Kahn 算法 DFS 算法 拓扑排序(TopoSort)有相当广泛的应用,比如依赖关系分析.图是否有环的检测.编译 ...

  7. Codeforeces - 723D -Lakes in Berland

    Codeforeces - 723D -Lakes in Berland time limit per test2 seconds memory limit per test256 megabytes ...

  8. Codeforces Round #626(Div.2) 解题报告

    Codeforces Round #626 (Div. 2, based on Moscow Open Olympiad in Informatics) [前言] 最近沉迷只狼,好久没有打CF了,水平 ...

  9. D. Boboniu Chats with Du(Codeforces Round #664 (Div. 2) )

    感受 怎么这么傻逼的题目,我现场A不了呢?看来还有不少提升的空间怎么这么傻逼的题目,我现场A不了呢?看来还有不少提升的空间怎么这么傻逼的题目,我现场A不了呢?看来还有不少提升的空间 题意 简单来说,给 ...

最新文章

  1. 小程序获取图片的宽高
  2. GPT2文本生成有问题?这里有些潜在解决思路
  3. Xamarin无法调试Android项目
  4. Mongodb数据分片的实现
  5. 【数字智能三篇】之一: 一页纸说清楚“什么是大数据”
  6. python 主语_前深度学习时代--FFM模型的原理与Python实现
  7. 打印二叉树的所有路径
  8. 李宏毅老师机器学习和深度学习
  9. 日志间隔_在日志中搜索时间间隔
  10. [下载]青岛交通旅游地图[download]
  11. UPSNet论文笔记
  12. android studio的 gradle 依赖同步错误解决方法
  13. geitee仓库项目拉到(克隆到)本地
  14. 计算机二级学科代码,二级学科分和代码表.doc
  15. 《货币金融学》期末复习题
  16. FPGA实现伪彩色图像
  17. AndroidStudio 之Safe Delete 安全删除
  18. 机器学习实践—基于Scikit-Learn、Keras和TensorFlow2第二版—第9章 无监督学习技术(Chapter9_Unsupervised_Learning_Techniques)
  19. 进化算法EA——多对象优化遗传(MOO),差分进化法(DE),遗传编程(GP)
  20. hypermesh 连接单元_HRS连接器U.FL-R-SMT-1(10)插座样图查询

热门文章

  1. 【大数据竞赛】2022MathorCup大数据挑战赛 B题 北京移动用户体验影响因素研究 探索性数据分析
  2. tomcat如何编译java_tomcat怎么编译java
  3. 21. A1088 Rational Arithmetic
  4. Eclipse集成SVN报Failed to load JavaHL Library
  5. Vayo-Gerber View安装教程
  6. 杭州2w的应届生补贴如何领
  7. 诺基亚忘记锁码怎么办
  8. Linux网络机顶盒rom,Amlogic 电视盒子修改Rom包,升级
  9. Node.js到底是什么?为什么要使用它?
  10. xxl-job任务调度中心详细介绍和使用