算法实验题 5.1 湖泊
问题描述
小 G 最近开始对地理感兴趣,小 G 找来了伯兰的地图,并用网格将其划分。被划分后
的地图是一个 n*m 的矩形。每一个单元格的大小是 1*1 的,每一格代表着水或者陆地。地
图外则代表着海洋。湖泊是相邻的所有代表水的格子组成的不与海洋相邻的最大区域。地图
上有着超过 k 的湖泊,小 G 想将其中的一些代表水的格子变为陆地,使得地图中只存在精
确的 k 个湖泊,又不想改变太多的格子。所以,他请你帮忙计算使得地图中只存在 k 个湖泊
所需要改变的最小格子数。
★数据输入
输入的第一行为包括三个整数n,m,k(1 ≤ n, m ≤ 50, 0 ≤ k ≤ 50)表示地图的大小和需
要保存的湖泊数量。
接下来 n 行,每行包括 m 个字符用来表示地图信息,只包括“.”和“*”两种字符。( “.”
表示水, “*”表示陆地)。
输入数据保证原始的湖泊数量大于等于 k。
30%的数据 n*m<=30。
70%的数据 n*m<=200。
100%的数据 n*m<=2500。
题意:
给n,m和k,n和m为所给矩阵的高和宽。k是要求最多剩下的湖的数量。
在所给的矩阵中,*代表陆地,.代表水。
湖的定义是一片连续的水(上下左右四个方向),并且水不含边界。
水含边界的情况被成为海。
问最少填多少湖的面积,使得湖的数量减少到k.
海洋包围的小岛,岛内的有湖,'.'代表水,'*'代表陆地,给出的n*m的地图里至少有k个湖,求填掉面积尽量少的水,使得湖的数量正好为k。
解题思路:先深搜DFS找出所有的湖泊,然后按照面积从小到大排序,若湖的数量为cnt,填掉前cnt-k个湖。
#include<stdio.h> #include<string.h> #include<iostream> #include<algorithm> using namespace std; //author:zeze 2016-12-11 13:24:39 //DFS+Greedy struct lakes{int x,y;//lake siteint num;//lake size }lake[2500]; bool cmp(lakes a,lakes b){return a.num<b.num; } int sx[4]={0,0,-1,1}; int sy[4]={-1,1,0,0}; char map[51][51]; bool vis[51][51]; int num,cnt,ans,isLake; int n,m,k; void dfs(int x,int y){int xx,yy;vis[x][y]=1;num++;if(x==0||x==n-1||y==0||y==m-1)//link to oceanisLake=0;for(int i=0;i<4;i++){xx=x+sx[i];yy=y+sy[i];if(xx>=0&&xx<n&&yy>=0&&yy<m&&map[xx][yy]=='.'&&!vis[xx][yy])dfs(xx,yy);} } void fillLake(int x,int y){int xx,yy;vis[x][y]=1;ans++;map[x][y]='*';//fill this lakefor(int i=0;i<4;i++){xx=x+sx[i];yy=y+sy[i];if(xx>=0&&xx<n&&yy>=0&&yy<m&&map[xx][yy]=='.'&&!vis[xx][yy])fillLake(xx,yy);} } int main(){int i,j,t;cnt=ans=0;scanf("%d %d %d",&n,&m,&k);for(i=0;i<n;i++)scanf("%s",map[i]);memset(vis,0,sizeof(vis));for(i=0;i<n;i++){for(j=0;j<m;j++){if(!vis[i][j]&&map[i][j]=='.'){//unVisit and isWaterisLake=1;num=0;dfs(i,j);if(isLake){// Is Lake? Yes!lake[cnt].x=i;lake[cnt].y=j;lake[cnt++].num=num;}}}}sort(lake,lake+cnt,cmp);//sort lakes by nummemset(vis,0,sizeof(vis));for(t=0;t<cnt-k;t++){//fill mini lakefor(i=0;i<n;i++){for(j=0;j<m;j++){if(i==lake[t].x&&j==lake[t].y){//unVisit and isWater fillLake(i,j);}}}}printf("%d\n",ans);for(i=0;i<n;i++){printf("%s\n",map[i]);}return 0; }
#include<bits/stdc++.h> using namespace std; int n,m,k; char a[55][55]; bool vis[55][55]; int dx[6]={0,0,1,-1}; int dy[6]={1,-1,0,0};int num,cnt,islake; int ans;struct lake{int x,y;int num;int id; }lk[2600];bool cmp(lake a,lake b){return a.num<b.num; }void dfs(int x,int y){vis[x][y]=1;num++;if(x==0||x==n-1||y==0||y==m-1)//形成海洋不是湖islake=0;for(int i=0;i<4;i++){int nx=x+dx[i],ny=y+dy[i];if(nx>=0&&nx<n&&ny<m&&ny>=0&&a[nx][ny]=='.'&&!vis[nx][ny])dfs(nx,ny);} } void fil(int x,int y,int id){vis[x][y]=1;ans++;a[x][y]='*';//填充这个湖for(int i=0;i<4;i++){int nx=x+dx[i],ny=y+dy[i];if(nx>=0&&nx<n&&ny<m&&ny>=0&&a[nx][ny]=='.'&&!vis[nx][ny])fil(nx,ny,id);} } int main(){cnt=0;scanf("%d%d%d",&n,&m,&k);for(int i=0;i<n;i++){scanf("%s",a[i]);}memset(vis,0,sizeof(vis));for(int i=0;i<n;i++){for(int j=0;j<m;j++){if(!vis[i][j]&&a[i][j]=='.'){num=0;islake=1;dfs(i,j);if(islake)lk[cnt++]=(lake){i,j,num,cnt};}}}memset(vis,0,sizeof(vis));sort(lk,lk+cnt,cmp);for(int l=0;l<cnt-k;l++){for(int i=0;i<n;i++){for(int j=0;j<m;j++){if(i==lk[l].x&&j==lk[l].y)fil(i,j,lk[l].id);//填充这个湖 }}}printf("%d\n",ans);for(int i=0;i<n;i++){printf("%s\n",a[i]);} }
算法实验题 5.1 湖泊相关推荐
- 数据结构与算法实验题 4.2 Who is the strongest
数据结构与算法实验题 4.2 Who is the strongest ★实验任务 在神奇的魔法世界,召唤师召唤了一群的魁偶.这些魁偶排成一排,每个魁偶都有一个 战斗值.现在该召唤师有一个技能,该技能 ...
- 数据结构与算法实验题 6.1 鼹鼠掘土挑战赛
数据结构与算法实验题 6..1 鼹鼠掘土挑战赛 ★实验任务 在潘多拉星的哈利路亚山上,生活着许多鼹鼠矿工,它们同属于潘多拉矿业公司哈利路 亚分公司.尽管在潘多拉星最美丽壮阔的地方工作,是一件十分让普通 ...
- 数据结构与算法实验题 10.1 神谕者
★实验任务 众所周知,dota 中神谕者的大招可以抵挡所有伤害,但是当大招结束时会一次性结算所有伤害.神谕者在大招期间已经遭受了 n 次伤害,他现在希望知道自己所遭受伤害中的第 k 小伤害值,但是他 ...
- 算法实验题(涉外黄成老师!!!)
日期 2022.11.19 目录 实验报告一 第一题 2 实验报告二 第二题 3 实验报告三 第三题 4 实验报告四 第四题 5 实验报告五 第五题 6 实验报告六 第六题 7 实验报告一 第一题 一 ...
- 数据结构与算法实验题 9.8 转移炸弹
★实验任务 A国有 N个城市,这些城市编号为 1到 N,有一天,他们调查出恐怖分子在每个城市中都安放了炸弹,于是他们给炸弹也编上了序号,第 i 个城市里的炸弹编号为 i.现在他们想把这些炸弹转移,以便 ...
- 数据结构与算法实验题 7.2 连环计
问题描述: 赤壁之战前夕,庞统向周瑜献连环计,瑜设计使蒋干邀庞统到曹营.操与统同观营寨,又共论兵法.统对答如流使操敬服.统乘机提出:大江中风浪不息使北兵易生疾病.可将大 小船配搭,首尾用铁环连锁,铺阔 ...
- 数据结构与算法实验题7.2 连环计
问题描述: 赤壁之战前夕,庞统向周瑜献连环计,瑜设计使蒋干邀庞统到曹营.操与统同观营寨, 又共论兵法.统对答如流使操敬服.统乘机提出:大江中风浪不息使北兵易生疾病.可将大 小船配搭,首尾用铁环连锁,铺 ...
- 算法实验题 1.4 画展活动
一.题目 Description 周末,小 F 去参加画展,他希望在画展中能够欣赏到尽可能多的画作. 画展的场地是一个 nm 大小的长方形广场,对于其中的每一个格子,它可能是空地或 者是一个展板,如果 ...
- 算法与数据结构实验题 10.23 寡人的难题
算法与数据结构实验题 10.23 寡人的难题 ★实验任务 寡人心系天下为国为民,想要在历史中留下点痕迹,就必须要让国家强盛起来,正所谓想致富先修路,寡人觉得去修路,那些吃干饭的大臣给了寡人很多条要修的 ...
最新文章
- JSON数据解析:Gson(谷歌)和fastjson(阿里巴巴)的异同点
- MyEclipse 深色主题
- DataWorks 功能实践速览
- ipython和jupyter哪个好_对Python开发者而言,IPython仍然是Jupyter Notebook的核心
- java枚举的线程安全及序列化
- 2015-2016 Northwestern European Regional Contest (NWERC 2015)
- (一)在Lingo中使用集合
- edittext在哪可以获取有效值_java-从EditText获取文本字符串?
- 常用SQL Server数据修复命令DBCC一览(转载)
- python简单程序实例-python实现的简单窗口倒计时界面实例
- 晨风机器人回复词库_晨风qq机器人词库下载2015 最新完整版
- 大数据shipin教程_大数据自学全套视频教程下载
- 【转】Tapestry5和Eclipse的整合
- 计算机瞬间黑屏又自动恢复,电脑显示器突然黑屏然后过几秒又自动恢复过来为什么?-显示器黑屏几秒又好...
- HTML超链接QQ在线聊天
- paypal简单分享
- PHP中 die() 和 exit() 的区别
- lg手机历史机型_用10款手机来看LG手机的发展
- KlayGE-001-简介
- HTML5+CSS期末大作业:环保网站设计——环境保护(10页) 含设计报告 HTML+CSS+JavaScript 静态HTML环境保护网页制作下载 DIV+CSS环保网页设计代码
热门文章
- xsemaphoretake返回_【FreeRTOS操作系统教程】第21章 FreeRTOS计数信号量
- ssl证书会过期吗?ssl证书过期了怎么解决
- python深度文字识别_【OCR技术系列之四】基于深度学习的文字识别(3755个汉字)...
- matlab 振动,基于matlab的振动系统仿真.doc
- 怎样选数据分析培训机构,选择数据分析培训机构需要注意什么
- 【机器人基础】机器人学精简笔记-空间描述和变换
- 实习生被拒绝的N个理由
- mysql数据库隔离级别
- 素数完数c语言,完数—C语言实现
- orbslam2稠密地图转octomap