CSDN首页 空间 新闻 论坛 Blog 下载 读书 网摘 搜索 .NET Java 视频 接项目 求职 在线学习 买书 程序员 通知
山寨机中的战斗机! 程序优化工程师到底对IT界有没有贡献
CSDN社区
搜索 收藏 打印 关闭
CSDN社区 >  专题开发/技术/项目 >  数据结构与算法

难题求解,智商高的进来看看!

楼主mousubin(msb)2001-11-08 22:51:41 在 专题开发/技术/项目 / 数据结构与算法 提问

已知一个平面有若干个点,在每个点旁边放一个小矩形,矩形紧靠着点,怎样做才能使这些矩形尽可能的不重叠? 问题点数:202、回复次数:40Top

1 楼mousubin(msb)回复于 2001-11-08 22:55:19 得分 0

能提出一点想法的都给分奖励Top

2 楼wyzegg(蛋)回复于 2001-11-08 23:36:40 得分 0

如果只是这个约束的话很简单啦,矩形很小就可以啦  
  Top

3 楼mousubin(msb)回复于 2001-11-08 23:52:31 得分 0

倒~,什么回答Top

4 楼Hover_cn(翔)(:public IUnknown)回复于 2001-11-09 00:12:44 得分 0

什么题目嘛?Top

5 楼sizhi(人在江湖飘啊~,哪能不挨刀啊~~)回复于 2001-11-09 08:19:26 得分 7

请把题目说清楚:  
          是不是点不在矩形上,如果只是“紧靠”的话可以无限接近,而不相交,还有矩形是不是尽可能的大,以填充(有限)平面,点的分布毫无规律可言?一个点对应一个矩形?。。。。Top

6 楼juqiang(方枪枪(正在修炼伤心小箭))回复于 2001-11-09 08:35:38 得分 0

study!!1Top

7 楼fkpwolf(如果你没有安全感,请带上安全套)回复于 2001-11-09 08:36:17 得分 0

先从3或者4个点开始Top

8 楼ga3ga3(噶3噶3)回复于 2001-11-09 08:46:30 得分 0

这个题目有意思。矩形至少有大小吧Top

9 楼lxp981818(lxp981818)回复于 2001-11-09 08:46:42 得分 0

你得说得更清楚一点!Top

10 楼mousubin(msb)回复于 2001-11-09 12:44:04 得分 0

矩形是事先知道大小的  
  应用背景:地图显示,如显示城市、机场、地标等等,如果比较多,要使名字尽可能的不重叠显示,重叠的话就会看不清了Top

11 楼bluecrest(高歌)回复于 2001-11-09 12:47:38 得分 0

是不是弄个区域把点圈起来  
  然后在区域外化矩形好了Top

12 楼xtky_limi(窗外细雨)回复于 2001-11-09 12:48:16 得分 0

地图尽量大点!!Top

13 楼bluecrest(高歌)回复于 2001-11-09 12:49:18 得分 0

是把若干个点Top

14 楼mousubin(msb)回复于 2001-11-09 13:12:49 得分 0

我见过Encarta   世界地图这个东西就有这样的功能,它上面所有的名字都不会互相重叠显示,甚至河流的名字都会随着河流的走向自动调整,以保证能正确的显示出来(如果河流有部分在屏幕外),百思不得其解,觉得有点神奇Top

15 楼cp_wan(cp_wan)回复于 2001-11-09 13:14:08 得分 0

可否规定在点的右面及下面(或相反)的方向画矩形,当然,可能要测出点与点间的距离Top

16 楼flagfly(我也不知道要去哪里)回复于 2001-11-09 13:48:00 得分 20

给你个算法:  
  有N个点,点的坐标知道。从1开始,在每个点的0度的地方放置你的矩形,放置的大小,远近完全由自己定,但保证每个点对应的相同。放完后计算得到矩形的四个点坐标。  
  ...  
  接着放置第k个,同样计算其矩形的坐标,然后分别计算其是否与前k-1个矩形重合(这个算法应该很好做了)。如果不重合,则处理k+1个。如果重合,然后在点的10度的地方放置此矩形,再计算一遍,以后每次增加10度,如果到360度还重合,则调整第k-1个点的矩形到10度,再计算k-1点是否与以前的重合...以此类推。  
  这里还可以有好多办法进行优化,比如N个点的顺序排列,或者在k点的360度摆放中统计与哪个点重合的次数最多,则调整该点的角度,而不是调整k-1点的角度等Top

17 楼whiskers(胡子)回复于 2001-11-09 14:16:54 得分 0

关键是看你的数据组织的如何  
  我的做法是根据比例尺来确定那些显示与否Top

18 楼Kevin_qing()回复于 2001-11-09 14:23:29 得分 0

.           .  
              .  
  .  
   
  ->  
    ------  
  |------|  
    ------  
  Top

19 楼supperapplication(行星)回复于 2001-11-09 15:49:19 得分 0

up.Top

20 楼mousubin(msb)回复于 2001-11-09 20:04:32 得分 0

flagfly的计算方法在坏的情况下是否复杂度太高了Top

21 楼zengting(喜欢隐身的爱情魔法师)回复于 2001-11-10 11:13:02 得分 5

矩形是方形Top

22 楼passing_time(小龙祥子)回复于 2001-11-10 18:09:38 得分 20

第一点:以目标地址为中心,寻找出周围最近的可能与矩形重叠的点的位置。  
  第二点:我认为不必在任一角度测试能不能放下地址矩形,只在上下左右四处作测试即可。  
  第三点:测试放矩形的方法。首先,每个地名的长度是不一样的,因此应该根据地名的长度  
                  选择合适的矩形,最好定义几种形态利用枚举法来检测是否可以放下。假如放不  
                  下再考虑第四点。  
  第四点:假如放不下,需要分两步改变并测试。第一种:减小字体,当然也就减小了矩形的  
                  大小,同时与方向的改变进行组合,然后测试。如果仍然有重叠,此时再考虑调  
                  整周围每个方向最近的点的放置。如果能够直接调整重叠的点的矩形位置最好。  
  第五点:如何判别两个矩形是否重叠?最简单的方法:假设矩形的四个顶点的X,Y坐标中含  
                  有以下四个值x1,x2,y1,y2,并且x1<x2,y1<y2.另一个矩形的某一个顶点的坐标    
                  为x,y,如果x1<x<x2且y1<y<y2,则矩形必然重叠。  
  全部分析完成。  
  Top

23 楼mousubin(msb)回复于 2001-11-11 18:26:57 得分 0

自己UP一下Top

24 楼Arter(阿蒂尔)回复于 2001-11-11 20:51:20 得分 10

把过每个点与x轴,   y轴平行的两条直线画出来,这样相交所得矩形列,放一个小矩形紧靠着点与矩形列中的一个至少有两边重叠,再对小矩形进行调整.  
  Top

25 楼laozi(老子)回复于 2001-11-12 11:03:09 得分 10

没有好的专业算法,你就回溯吧!Top

26 楼mousubin(msb)回复于 2001-11-12 22:42:56 得分 0

为何没有好的算法啊?Top

27 楼Fairton(飞云)回复于 2001-11-13 16:07:02 得分 10

模糊算法  
  想象一下很多水球挂在链子上,然后放入水中的排列方式就可以啦Top

28 楼GZCompiler(编译器)回复于 2001-11-13 17:26:04 得分 0

不要先画后摆方,这样不好。  
  我认为应先为每个点划分他们自己的“私有区域”,然后在每个点的“私有区域”里面作标注,这样谁也不影响谁了。  
  实现的关键在于怎么划分“私有区域”,还要算法简单,速度快。  
  我对划分“私有区域”的想法是:  
  1.选定一个点作为考虑对象,然后将与该点距离在一定范围内(标准是距离小于R或所处区域相隔较近,比如北京位于东八区、东京位于东七区。或者其他什么更合理的标准)的点也纳入考虑范围。  
  2.将主要考虑的点和他周围这些点的连线的中点找出来,这些中点可组成一个多边形,可以看出不同点的多边形是互不侵犯的。  
  3.想办法在“私有区域”里面作标注。  
   
  要注意的问题:如果一堆点离得很近,那什么算法也没办法,就是让你手工去标你也没法标,意思就是不能企图要在地图上标清四合院每家住的都是谁,因为他们离得太近了,当然这只是相对的,比例尺变了就不一样了,要灵活处理。^_^  
          “私有区域”怎么划分对实现来说关系很大,可以考虑其他别的什么好办法。Top

29 楼GZCompiler(编译器)回复于 2001-11-13 17:43:47 得分 0

又有一想法:  
  屏幕上的点一般不会互相冲突,为什么呢?因为在屏幕上,点用像素来表示,像素之间都是互斥的,所以不出现重叠情况。  
  再想一想为什么标注会重叠呢?因为标注是由多像素来表示的。  
  好了,解决问题的方法出现了:将屏幕重新划分成更大块(矩形)的“像素”,大小就看你标注的需要了。  
  这样划分之后,为某个点作标注时,就把标注作在离该点最近且未使用的大块“像素”里,然后把  
  该大块“像素”标记为已使用,依次标完每个点就可以了。  
  当然了,这种方法也会有不足的,可能出现某一点的标注离别的点比自己还近,但可以考虑一种方  
  法将结果优化一下。Top

30 楼jrju()回复于 2001-11-13 22:01:14 得分 20

mousubin兄:  
           
          我觉得这个题目应该是这样的:  
   
          已知条件:有N个矩形(大小不一但已知)分别一一对应于平面上的N个点(坐标已知)  
   
          要求:将N个矩形放置在平面上。各矩形之间互不重叠,且与其对应点的距离尽量接近  
                      并不得超过一给定距离r。  
           
          输入:N,r                             //   矩型数,         最大偏移距离  
                      Rect(1),Point(1),//   第一个矩形,第一个矩形对应的平面上的点  
                      Rect(2),Point(2),//   第二个矩形,第二个矩形对应的平面上的点  
                      ...  
                      Rect(N),Point(N))   //   第N个矩形,   第N个矩形对应的平面上的点  
   
          输出:RectCenterPoint(1),         //   第一个矩形的中点  
                      RectCenterPoint(2),         //   第二个矩形的中点  
                      ...  
                      RectCenterPoint(N)           //   第N个矩形的中点  
          若无解:Allert("No   Solution")  
   
          很不错的一个题目,有点意思,我会考虑的。Top

31 楼mousubin(msb)回复于 2001-11-13 22:37:43 得分 0

非常感谢大家的热情参与,这个问题可能在许多情况都挺有用的,希望大家多提看法:)Top

32 楼mousubin(msb)回复于 2001-11-13 22:41:32 得分 0

对于GZCompiler(编译器)的第二种办法,我有一种想法不知可不可行,把屏幕按照点的坐标分割成矩形阵列,对于每一个点,找出它附近四个矩形中的最大的一个,以在此矩形中紧靠点放置矩形为优先考虑,这样是不是可以避免多数的重叠情况?Top

33 楼GZCompiler(编译器)回复于 2001-11-14 09:16:54 得分 20

这样划分也不错,还可以防止标注覆盖到点的情况发生。但这种划分方法还有一个问题:  
  如果某两点处于点比较稀疏的区域(如新疆省的城市),这两点之间距离也比较大,那么靠这两点  
  划分出的矩形也会较大,这么大的矩形足够容纳两个点的标注,那么第一个点在里面放置标注后,第二个点是否一定要避开呢?  
  我觉得,某一点不在某一区域放置标注的条件是:  
  1.该区域和点不相邻(废话)  
  2.该区域已被占用且大小不够再容纳另一标注。  
  3.该区域太小。  
  其实2、3是一致的,3是2的一个特例而已。  
  你再考虑考虑,这个问题很有意思。如果出成果了,别忘通知兄弟们一声。Top

34 楼hz1101(lake)回复于 2001-11-14 18:13:02 得分 20

我也是作地图的,我想通过算法无法解决这个问题,打一个比方,在一个非常小的范围内(10平米)有20个点,你的ZOOM值是20公里的话,你想矩形不重叠是不可能的,否则看上去很怪异,我觉得应利用绘图的优势去处理,首先根据对象的走向画矩形,如果在规定的范围内已有矩形存在(会重叠),则进行角度旋转扫描,以寻找合适的位置。在寻找位置过程中可能涉及较复杂的算法。Top

35 楼mousubin(msb)回复于 2001-11-14 18:16:23 得分 0

还有我上面也提到了另一个问题,就是对于象河流这样的折线的文字放置方法,应该采取些什么方法?Top

36 楼mousubin(msb)回复于 2001-11-14 18:18:40 得分 0

如果象HZ1101所说的无法避免的情况,是没有办法的,我以上是指在可能的情况之下,尽量作到不重叠处理Top

37 楼Zig(Zig)回复于 2001-11-14 18:29:24 得分 20

贪心了,最大独立集问题   Top

38 楼chunter(浪人)回复于 2001-11-15 00:08:19 得分 20

我觉得在每个点的周围去找方圆最近的点,(x1,y1)   ,   (x2,y2)   其中x2   >   x1.  
  1。y1<   y2   or   y1   >   y2   时   如果以这两个点所在的线段为对角线的长方形,如果要存放的标注所需的大小比长方形面积大,可以考虑增加x的大小,这样就可以写下来,当然增加x后,没有点在这个区域范围内了。  
  2。y1   =   y2   时,可以考虑那一个点的注释要大一点的面积,如果大的可以调整其的y值  
  使用后的矩形所在的区域,其他的矩形就不能跟它重叠了。  
  不过这还是要使用回溯,找出最优的方案,不能这样处理的再使用人工的算了。  
  人定胜天!Top

39 楼ritchiex(hxx)回复于 2001-11-15 01:19:55 得分 20

这和第九届IOI的第3题很象,那题是在地图上给点标上地名,记得当时max是1000*1000的地图,和max是1000的地点。规模相当大,用一般的回溯没法在规定的时间内完成,我做的时候用拉构造图论模型,和用贪心法求一个无向图的最大独立集,其算法比较简单,很容易实现。Top

40 楼mousubin(msb)回复于 2001-11-15 19:33:23 得分 0

ritchiex能给出具体一点的解释让大家讨论讨论吗?Top

相关问题

  • 难题!!!!求解?
  • 难题求解!!!
  • 难题求解
  • 求解难题!!!!
  • 难题求解
  • 有关TTreeView的难题,高分求解
  • 高分求解DHTML的难题
  • SQL难题求解?
  • 高分求解!!!!!!!!!两个问题!!!已经给出最高分啦!!难题求解。
  • 关于进程的大难题,高分求解!!

关键词

  • 矩形
  • 坐标
  • 算法
  • 区域
  • 测试
  • 重叠
  • 重合
  • 放置
  • 计算
  • 河流

得分解答快速导航

  • 帖主:mousubin
  • sizhi
  • flagfly
  • zengting
  • passing_time
  • Arter
  • laozi
  • Fairton
  • jrju
  • GZCompiler
  • hz1101
  • Zig
  • chunter
  • ritchiex

相关链接

  • CSDN Blog
  • 技术文档
  • 代码下载
  • 第二书店
  • 读书频道

广告也精彩

反馈

请通过下述方式给我们反馈
反馈
提问
网站简介|广告服务|VIP资费标准|银行汇款帐号|网站地图|帮助|联系方式|诚聘英才|English|问题报告
北京创新乐知广告有限公司 版权所有, 京 ICP 证 070598 号
世纪乐知(北京)网络技术有限公司 提供技术支持
Copyright © 2000-2008, CSDN.NET, All Rights Reserved
GongshangLogo