城市轮廓线求解

问题描述

每一个建筑物用一个三元组表示(L, H, R), 表示左边界, 高度和右边界,轮廓线用X,Y,X,Y…这样的交替式表示,给N个建筑,求轮廓线。

总体思路

首先,要将建筑物离散成点或线,方便运算。将建筑物表示成(L,H),(R,H)两个坐标表示,这样原来方块形的建筑物就离散成两条竖线。将所有的竖线按x坐标大小排序。
接下来,将排好序的数组的元素依次插入大顶堆(y坐标为key),如果堆中有与其y坐标相同的元素,则删除该元素(表示该建筑物已结束),否则直接插入堆中。简而言之,关注堆顶元素的变化,只要堆顶元素变化了,就输出堆顶元素的xy值。注意:如果是删除操作导致堆顶元素变化,输出的值应该为当前x值(curr_x),如果删除后,堆为空,那么y应该输出(curr_x,0)

示意图

输入:
这里写图片描述

离散化:
这里写图片描述

过程描述:
这里写图片描述

代码

工程结构:
这里写图片描述

可以看到,需要一个大顶堆(优先队列)——heap.c,一个排序算法,这里是归并排序——merge.c,作为辅助。

而关键代码只有如下几行:

//计算出天际线 ,输入已按x排好序的点数组 points , 和点数组的长度
void get_sky_line(struct Point* points,int length)
{/*实现原理:只要关注堆首元素的变化和堆为空时的处理即可。堆首元素变化只有两种情况,插入或删除事件点 */ struct Heap* heap =(struct Heap*)malloc( sizeof( struct Heap ) );struct Point array[ length ];heap->points = array;heap->size = 0;heap->length = length;struct Point p,old_max, new_max;         int i,curr_x,index;for( i=0 ; i<length ; i++ ){if( (index=exist(heap , points[i])) != -1 )  {p = heap->points[ index ]; curr_x = points[i].x;delete_i(heap , index);//print_heap(heap);if( heap->size == 0 ){p.y = 0;p.x = curr_x;add_to_result( p );   //1 }else if( index==0 ){ //首元素发生了变化 p = heap->points[ 0 ];p.x = curr_x;add_to_result( p );   //2} }else{old_max = heap->points[ 0 ];insert( heap , points[i] ); //print_heap(heap);new_max = heap->points[ 0 ];if( !point_equal(old_max , new_max)) //首元素发生了变化 {add_to_result( new_max ); //3}} }} int init(int bd_num)
{int i,j,left,height,right,ps_num=bd_num*2;struct Point points[ps_num];//输入建筑物参数printf("建筑参数为left height right形式,以空格分隔。\n");for(i=0,j=1;i<ps_num;i=i+2,j++){printf("输入建筑%d参数:",j);scanf("%d %d %d",&left,&height,&right);points[i].x=left;points[i].y=height;points[i+1].x=right;points[i+1].y=height;       }merge_sort(points,0,ps_num-1);   //将事件点排序   get_sky_line( points , ps_num );  //得到轮廓线}

附录:

  1. 广东工业大学-优先队列和二叉堆.pdf
  2. 轮廓线问题代码.zip

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/430222.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

wpf的listbox循环数据滚动_滚动版 CentOS Stream 和 Fedora 的关系

如果 CentOS 现在位于 RHEL 的上游&#xff0c;那么 Fedora 会发生什么&#xff1f;那不是 Fedora 在 Red Hat 生态系统中的角色吗&#xff1f;-- Matthew Miller&#xff08;作者&#xff09;一封来自 Fedora 项目负责人办公室的信件&#xff1a;&#xff08;LCTT 译注&#x…

位运算的妙用

位运算所有语言里面都有位运算&#xff0c;&&#xff0c;|,^,~,<<,>>,>>>&#xff0c;但是其他语言不清楚&#xff0c;前端估计许多人直接一扫而过&#xff0c;甚至把这玩意和逻辑或与混淆&#xff0c;甚至有的不认识<<,>>>,问这什么意…

AJAX中的跨域问题:什么是跨域?如何解决跨域问题?

域不一样的&#xff0c;即为跨域&#xff0c;包括&#xff08;协议&#xff0c;域名&#xff0c;端口号&#xff09; 1. 指定允许其他域名访问 header(Access-Control-Allow-Origin:*); 2.使用jsonp转载于:https://www.cnblogs.com/luckyXcc/p/5805909.html

求无序序列每个元素最接近的值

1、问题描述 给一个n个元素的线性表A&#xff0c;对于每个数Ai&#xff0c;找到它之前的数中&#xff0c;和它最接近的数。 即对于每个i&#xff0c;求 Ci min{ |Ai -Aj | | 1< j < i} 1.2算法分析 有两种思路可以解决上诉问题&#xff1a; &#xff08;1&#xff0…

python把list转成字典_python中将list转为dict

最近在项目中经常遇到将list转为dict形式&#xff0c;之前都只会用for循环&#xff0c;取出list中的每个值&#xff0c;update到dict中。 示例1 scrabble_scores [(1, "E A O I N R T L S U"), (2, "D G"), (3, "B C M P"), (4, "F H V W …

maven引入springframework的猫腻

看官网的quickstart&#xff0c;以为maven只要将quickstart里的配置复制到项目里就好了&#xff0c;但是在项目中使用jdbc和事物时&#xff0c;都提示找不到相关的类&#xff0c;才知道原来官网文档还有猫腻。 maven引入spring框架 project下框架有点多&#xff0c;点spring …

BAT批量处理 命令

第一章 批处理基础第一节 常用批处理内部命令简介批处理定义&#xff1a;顾名思义&#xff0c;批处理文件是将一系列命令按一定的顺序集合为一个可执行的文本文件&#xff0c;其扩展名为BAT或者CMD。这些命令统称批处理命令。小知识&#xff1a;可以在键盘上按下CtrlC组合键来强…

bigdecimal 小于等于0_半场0-0比分的比赛,你需要注意这些

大家好&#xff0c;我是师弟&#xff0c;今天给大家带来有关于半场0-0比赛的分析。前段时间有朋友向我吐槽道&#xff1a;“最近买半场0-0的比赛输惨了”&#xff0c;经过询问了解到他是专挑半场0-0的比赛在中场的时候买入大1.5&#xff0c;没想到输多赢少。而他的想法可能也代…

Spring JdbcTemplate实例

简介 Spring JdbcTemplate类是Spring提供的简化数据库操作的一个类&#xff0c;这个类使用了模板方法模式&#xff0c;可以减少一些重复代码。这里主要演示一下 JdbcTemplate 的使用。 完整的代码看这里&#xff1a;spring_jdbc_01 创建数据库 第一步是创建数据库。下面的S…

JS-为金额添加千分位逗号分割符

前言&#xff1a;这个功能在前端页面中使用的还是比较多的&#xff0c;正好我们的项目中也有使用此功能&#xff0c;不过YY同学写的代码不像个方法的样子&#xff0c;一个入口中间又插了几道子&#xff0c;所 以&#xff0c;我写了下面这个方法&#xff0c;经过测试…

将chart放入panel中出现滚动条_聊天场景在web前端开发中的体验与优化

在日常工作中&#xff0c;如下图的聊天场景是不是很熟悉&#xff0c;没错就是我们再熟悉不过的 QQ 和微信&#xff0c;一个正常的聊天界面大致上是长这个样子的&#xff1a;这种聊天窗口的消息流有两个明显的特点&#xff1a;最新的消息和滚动条初始位置需要在列表的最底部下拉…

一个(伪)MaterialDesign风格的博客园皮肤

皮肤长什么样&#xff0c;不用我说&#xff0c;相信各位点进来的看官都能看得一清二楚。 有关其他细节呢&#xff0c;也欢迎各位在我博客里逛逛&#xff0c;帮忙挑挑刺&#xff0c;提提建议。 由于水平有限&#xff0c;暂没能用CSS处理博客园的代码高亮字体&#xff0c;实在是有…

spring JdbcTemplate数据库查询实例

使用JdbcTemplate查询数据库的例子 配置等可以看前一篇文章&#xff1a; Spring JdbcTemplate实例 创建数据库 可以使用下面的SQL create table A( id INT (255) not null, primary key (id) ); 创建实体类 新建一个AEntity类用于映射表A的一行&#xff1a; Component p…

git checkout 单个文件_IntelliJ IDEA下的使用 Git

作者| JKYO链接 | cnblogs.com/pejsidney/p/9199115.html1、Git 简介Git是目前流行的分布式版本管理系统。它拥有两套版本库&#xff0c;本地库和远程库&#xff0c;在不进行合并和删除之类的操作时这两套版本库互不影响。也因此其近乎所有的操作都是本地执行&#xff0c;所以在…

小甲鱼c语言课后作业_知识,就是力量——山财“学习小课堂”助你蓄力

编者按少年&#xff0c;你渴望 知识的力量 吗&#xff1f;我们有山财最全的学习秘籍&#xff0c;只待你的耐心翻阅与潜心修炼&#xff01;接下来&#xff0c;就让我们一起查收学习干货~内容摘要本系列推送分为【悦览篇】【干货篇】【招募篇】三大模块。【悦览篇】编者会为大家推…

初步认识spring mvc

spring mvc 01Spring Web MVC是一种基于Java的实现了Web MVC设计模式的请求驱动类型的轻量级Web框架&#xff0c;即使用了MVC架构模式的思想&#xff0c;将web层进行职责解耦&#xff0c;基于请求驱动指的就是使用请求-响应模型&#xff0c;框架的目的就是帮助我们简化开发&…

使用junit+mockito进行mock测试实例

刚开始做网站的时候&#xff0c;测试都是这样的&#xff08;比如测试修改用户信息的表单逻辑&#xff09;&#xff1a;设置断点&#xff0c;启动运行程序&#xff0c;登陆&#xff0c;点击点击点击然后进入到测试的页面&#xff0c;输入测试数据&#xff0c;进入断点…….。一个…

sdk怎么用_PLC不支持OPC UA怎么办?别问了看完你就懂了

经常有人会烦恼这个问题&#xff1a;我的上位机软件什么功能都有&#xff0c;也支持OPC UA了&#xff0c;现在项目上准备用OPC UA的方式来获取我的PLC的数据&#xff0c;但是我的PLC却不支持OPC UA&#xff0c;怎么办呢&#xff1f;有的人碰到这个问题后就开始了“病急乱投医”…

js学习大法:用好firebug,走遍天下都不怕

用js有一段时间了&#xff0c;但是一直手感不好。平时用DW来写js代码&#xff0c;常抱怨js的编辑器的自动代码提示和调试功能用起来很不爽&#xff0c;自动代码提示十分有限&#xff0c;而且写错一个单词这样的错误都要运行整个网页之后才发现。今天闲来无聊&#xff0c;翻看了…

初学Java6:Java OOP基础语法总结

*************** Java OOP 基 础 语 法 总 结 ************************* 1,类与对象1),类(class)是相同属性和方法的一组集合。 A,类的组成&#xff1a;属性和方法。 B,语法声明&#xff1a;使用class关键字&#xff0c;eg&#xff1a;public class Student{}//类名首字母大写…