问题描述
小 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 湖泊相关推荐

  1. 数据结构与算法实验题 4.2 Who is the strongest

    数据结构与算法实验题 4.2 Who is the strongest ★实验任务 在神奇的魔法世界,召唤师召唤了一群的魁偶.这些魁偶排成一排,每个魁偶都有一个 战斗值.现在该召唤师有一个技能,该技能 ...

  2. 数据结构与算法实验题 6.1 鼹鼠掘土挑战赛

    数据结构与算法实验题 6..1 鼹鼠掘土挑战赛 ★实验任务 在潘多拉星的哈利路亚山上,生活着许多鼹鼠矿工,它们同属于潘多拉矿业公司哈利路 亚分公司.尽管在潘多拉星最美丽壮阔的地方工作,是一件十分让普通 ...

  3. 数据结构与算法实验题 10.1 神谕者

    ★实验任务  众所周知,dota 中神谕者的大招可以抵挡所有伤害,但是当大招结束时会一次性结算所有伤害.神谕者在大招期间已经遭受了 n 次伤害,他现在希望知道自己所遭受伤害中的第 k 小伤害值,但是他 ...

  4. 算法实验题(涉外黄成老师!!!)

    日期 2022.11.19 目录 实验报告一 第一题 2 实验报告二 第二题 3 实验报告三 第三题 4 实验报告四 第四题 5 实验报告五 第五题 6 实验报告六 第六题 7 实验报告一 第一题 一 ...

  5. 数据结构与算法实验题 9.8 转移炸弹

    ★实验任务 A国有 N个城市,这些城市编号为 1到 N,有一天,他们调查出恐怖分子在每个城市中都安放了炸弹,于是他们给炸弹也编上了序号,第 i 个城市里的炸弹编号为 i.现在他们想把这些炸弹转移,以便 ...

  6. 数据结构与算法实验题 7.2 连环计

    问题描述: 赤壁之战前夕,庞统向周瑜献连环计,瑜设计使蒋干邀庞统到曹营.操与统同观营寨,又共论兵法.统对答如流使操敬服.统乘机提出:大江中风浪不息使北兵易生疾病.可将大 小船配搭,首尾用铁环连锁,铺阔 ...

  7. 数据结构与算法实验题7.2 连环计

    问题描述: 赤壁之战前夕,庞统向周瑜献连环计,瑜设计使蒋干邀庞统到曹营.操与统同观营寨, 又共论兵法.统对答如流使操敬服.统乘机提出:大江中风浪不息使北兵易生疾病.可将大 小船配搭,首尾用铁环连锁,铺 ...

  8. 算法实验题 1.4 画展活动

    一.题目 Description 周末,小 F 去参加画展,他希望在画展中能够欣赏到尽可能多的画作. 画展的场地是一个 nm 大小的长方形广场,对于其中的每一个格子,它可能是空地或 者是一个展板,如果 ...

  9. 算法与数据结构实验题 10.23 寡人的难题

    算法与数据结构实验题 10.23 寡人的难题 ★实验任务 寡人心系天下为国为民,想要在历史中留下点痕迹,就必须要让国家强盛起来,正所谓想致富先修路,寡人觉得去修路,那些吃干饭的大臣给了寡人很多条要修的 ...

最新文章

  1. JSON数据解析:Gson(谷歌)和fastjson(阿里巴巴)的异同点
  2. MyEclipse 深色主题
  3. DataWorks 功能实践速览
  4. ipython和jupyter哪个好_对Python开发者而言,IPython仍然是Jupyter Notebook的核心
  5. java枚举的线程安全及序列化
  6. 2015-2016 Northwestern European Regional Contest (NWERC 2015)
  7. (一)在Lingo中使用集合
  8. edittext在哪可以获取有效值_java-从EditText获取文本字符串?
  9. 常用SQL Server数据修复命令DBCC一览(转载)
  10. python简单程序实例-python实现的简单窗口倒计时界面实例
  11. 晨风机器人回复词库_晨风qq机器人词库下载2015 最新完整版
  12. 大数据shipin教程_大数据自学全套视频教程下载
  13. 【转】Tapestry5和Eclipse的整合
  14. 计算机瞬间黑屏又自动恢复,电脑显示器突然黑屏然后过几秒又自动恢复过来为什么?-显示器黑屏几秒又好...
  15. HTML超链接QQ在线聊天
  16. paypal简单分享
  17. PHP中 die() 和 exit() 的区别
  18. lg手机历史机型_用10款手机来看LG手机的发展
  19. KlayGE-001-简介
  20. HTML5+CSS期末大作业:环保网站设计——环境保护(10页) 含设计报告 HTML+CSS+JavaScript 静态HTML环境保护网页制作下载 DIV+CSS环保网页设计代码

热门文章

  1. xsemaphoretake返回_【FreeRTOS操作系统教程】第21章 FreeRTOS计数信号量
  2. ssl证书会过期吗?ssl证书过期了怎么解决
  3. python深度文字识别_【OCR技术系列之四】基于深度学习的文字识别(3755个汉字)...
  4. matlab 振动,基于matlab的振动系统仿真.doc
  5. 怎样选数据分析培训机构,选择数据分析培训机构需要注意什么
  6. 【机器人基础】机器人学精简笔记-空间描述和变换
  7. 实习生被拒绝的N个理由
  8. mysql数据库隔离级别
  9. 素数完数c语言,完数—C语言实现
  10. orbslam2稠密地图转octomap