PKU 1113 Graham Scan求凸包

PKU 1113
最近一直在被计算几何虐,几十个函数几百行的代码还要人肉手工测量可用性。学习凸包之际碰到了这个题(虽说解答是用

了很裸的凸包,但是题目本身很不错,本菜也很少动辄冠以哪个题以水题的称号,究其原因是自己依然很菜,很多题要抱着

学习的心态去解决,题目本身能教会我很多东西,对这些题目多是敬仰,比如A+B,带给我的是ACM入门的第一个鼓励,我也

没公然说过A+B水)。

不扯淡了。这个题的解答结果是凸包周长+圆周长。为什么呢?

首先我们对于所给的castle进行Graham Scan求凸包,刨去题目给定的距离限制,由凸包的性质知这个wall的周长肯定是包

围所有castle的最小的周长了,如图1所示,

 图片1

                                 图1

然后要加上题目要求的所建wall对每个castle的距离不得小于r,那么我们对凸包的每条边进行垂直本边所在直线方向平移r的距离,这个边肯定是结果wall的一条边(可用反证法证明之),等到所有边平移后,会发现此时的wall存在缝隙,如图2

                          图2

我们怎么进行这些缝隙的填充呢?很简单,根据距离最短性,只要以凸包每个顶点为圆心,r为半径画圆,将缝隙两端点连接即可,这些弧也是结果wall的一些边(可反证)。最终的wall如图3所示

                        图3

那么此时wall的长度怎么算呢?它就等于初始求出的凸包周长+后来加上的那些弧。前者周长容易得到,关键之这些弧的长度和怎么取。

我们拿点A为例说明,A上弧的圆心角是α,A顶点在所属凸包中的角度是β,那么根据前面平移凸包的边时我们采取垂直移动,得到α + β = 360° - (90° + 90°) = 180°,而根据多边形内角和定理:n变形的内角和为(n - 2) * 180°,
可得∑(0 <= i < n) β[i] = (n - 2) * 180°,其中β[i]表示凸包的第i个顶点。联立上面那些式子我们最终得到:
∑(0 <= i < n)α[i] = n * 180 - ∑(0 <= i < n) β[i] = 360°。也就是说,这些弧的圆心角之和是360°,再加上半径相等的条件,这些弧其实正好组成一个圆。

最终制造好的wall如图4:

                     图4(画搓了)

done……
code:
   自己写去。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值