暑期集训中做了 POJ 2187 题,噩梦一场,但是这次仔细把一些 Graham 算法在处理存在三点在一条直线上问题的改进方法找到了。

题目意思很明确:给你平面上的一坨点,求最远两点距离的平方。

思路很容易,很多的解题报告上都有阐述,仅两步:1. 求凸包; 2. 旋转卡壳。

我们都知道,Graham 算法是二维凸包的一种相当好写的算法。但是当有三点一线的情况,此种算法就有可能出现问题。这个坑,在我看来,相当难查。

先贴一段 Graham 算法的代码。

bool cmp(point a, point b)
{return direction(p[0], a, b) < 0;
}void getConvex()
{swap(p[0], p[Basis]);Basis = 0;sort(p + 1, p + n, cmp);Top = 0;p[n] = p[0];convex[0] = p[0];convex[1] = p[1];if (n == 2)return;Top = 1;for (int i = 2; i <= n; i++){while (Top > 0 && direction(convex[Top - 1], convex[Top], p[i]) >= 0){Top--;}convex[++Top] = p[i];}
}

当此代码遇到有三点一线的情况,会出现什么问题呢?

先看下图,比较和谐的情况。

排序后按极角从小到达给编上号。首先 0,1 入栈  然后 2 入栈后由于 0-1-2 方向不是向左,于是将 1 弹出

再看一个不那么尽如人意的例子。我们知道,快速排序对于两个关键字相等的元素,其排序后的先后顺序是不可预知的。很有可能出现以下情况。

注意此时 0 1 入栈,按顺序 0 - 1 - 2 判断 显然 0 - 1 - 2 不是左转(用上述 cmp 函数判断为直线)。于是,万恶就此开始。1 被抛弃了。

显然这样凸包就求错了。

两种解决方案:1. 改用 Jarvis 步进法;2. 改进 cmp 函数。

改进 cmp 函数的方法是这样的:极角相同时,认为离基准点近的小,排在前面。

于是一切情况就转为和谐情况。并且此凸包上包含的点一定是最少的。

很多解题报告改变了弹栈的条件。直线情况不弹栈。我认为这样凸包上的点会略多,对后续的操作显得有些累赘了。

极角排序代码如下:

bool cmp(point a, point b)
{if (direction(p[0], a, b) == 0)return SQ(a - p[0]) < SQ(b - p[0]);return direction(p[0], a, b) < 0;
}

SQ 代表向量的模的平方。p[0] 为基准点。

旋转卡壳什么的我就不贴代码了,不缺我这份。希望此日志能对陷在 POJ 2187 的同志们一些帮助……

此题卡我良久……同时感觉收获良多……特拿出来与大家分享。

--penhu, ShadowSword.

2012.8

【POJ 2187】如何修改Graham算法,才能使之顺利解决三点一条直线的问题。相关推荐

  1. 运筹作业题:一个正三角形平面,在三个角的部分减去一部分,然后沿着剪开部分折叠起来,使折叠后的三棱台体积最大

    文章目录 1. 题目 2. Python求解 3. 作业纸上的描述 1. 题目 一个正三角形平面,边长为1,在三个角的部分减去一个四边形,然后沿着剪开部分折叠起来,该怎么剪,才能使折叠后的三棱台体积最 ...

  2. [Poj 2187] 计算几何之凸包(二) {更高效的算法}

    { 承上一节 继续介绍点集的凸包  (下文中所有凸包 若不做特殊说明均指点集的凸包) 这一节介绍相比更高效的算法 } ========================================= ...

  3. HDUOJ 1392凸包graham算法

    #include <iostream> #include <cstdio> #include <cstring> #include <cmath> #i ...

  4. poj 2187 Beauty Contest(凸包求解多节点的之间的最大距离)

    1 /* poj 2187 Beauty Contest 2 凸包:寻找每两点之间距离的最大值 3 这个最大值一定是在凸包的边缘上的! 4 5 求凸包的算法: Andrew算法! 6 */ 7 #in ...

  5. 格式工厂转换视频怎样设置才能使视频大小缩小

    格式工厂转换视频怎样设置才能使视频大小缩小 1.设置屏幕大小 2.对比特率进行更改(说明:采样率在一定特殊情况下也可进行修改,只是记得转换完成后,浏览查看,可能会有声音出不来的情况.如果出现,采样率还 ...

  6. 【知识积累】CS4.4绕过vultr特征检测修改checksum8算法

    前言 众所周知,关于cs相关的资料都非常的少,并且是打得特别紧,特别是这两年各个安全厂商对cs相关的内容都给予了特征识别等严重的打击,例如vultr网站会检测特征并关停服务器,我们可以同个多种方式更改 ...

  7. 【计算几何】凸包之graham算法(适合小白)

    计算几何–凸包(graham算法实现) 题目链接:LeetCode587 https://leetcode-cn.com/problemset/all/ 题目描述 在一个二维的花园中,有一些用 (x, ...

  8. 4、路由器和主机如何配置IP地址等信息才能使计算机相互通信

    文章目录 一.路由器和主机配置 1.路由器配置 ①路由器以太网口配置 ②路由器串口配置 ③路由器静态路由配置 方法一:网络路由 方法二:汇总路由1 方法三:汇总路由2 方法四:默认路由 2.主机配置 ...

  9. 三插头内部结构图_三方面维护硬度计才能使寿命更长久

    硬度计是光机电一体化的高新技术产品.与其他精密仪器一样,定期的保养维护少不了.轻则导致操作不顺畅,或试验结果有偏差;重则机器损坏,返厂维修耽误时间又费钱.如何才能使用寿命才能更长?现在为大家介绍一下在 ...

最新文章

  1. 适合初学者学java技术的书籍推荐!
  2. android 代码设置 键盘适应_Android自适应软键盘的Dialog以及监听软键盘弹起
  3. 图的单源最短路径:Dijkstra算法实现
  4. Ubuntu中设置静态IP和DNS
  5. C语言中,带空格的字符串输入
  6. 读取位置 0x00000028 时发生访问冲突该怎么解决
  7. python如何使用图片做背景_用Python批量给照片换底色,基于opencv模块
  8. python如何离线安装第三方模块_扣丁学堂python开发之第三方模块pip离线安装
  9. 网络分流器|运营商光纤延距解决方案
  10. [Android] 输入系统(二)
  11. POJ2481-Cows【树状数组】
  12. java程序员技术_JAVA程序员需要懂得哪些技术
  13. 效率工具:分享7款实用的任务管理软件,值得收藏!
  14. java工程师容易秃头吗_程序员更容易秃头?原因是什么?
  15. Mesh Slicer 切割人体的原理分析
  16. 用计算机弹的数字,在计算器上弹两只老虎是用那几个数字
  17. 科研论文翻译软件|无广告|强力推荐
  18. 微软出品:.net 微服务:容器化.net架构指南
  19. [iOS]转让APP
  20. Python3的桌面程序开发利器:Eric6的环境搭建、使用

热门文章

  1. Qt QlineEdit 限制输入中文和中文字符(允许英文及英文字符)
  2. R语言-模型拟合及预测(新数据集)常见问题及解决方案
  3. 万象:SpaceX 火箭回收的失败案例汇总
  4. OSI七层模型、TCP/IP五层(或四层)模型
  5. GO(golang)语言使用SMTP发送电子邮件,简单和复杂带附件cc,bcc
  6. 酷派8150S(移动定制版)可用的第三方Recovery备份数据、刷机并精简系统内置APK经验...
  7. 机器视觉-相机标定及畸变矫正
  8. android悬浮窗跑马灯,边缘闪光跑马灯
  9. 高新技术企业申请,申请高新技术企业需要什么材料
  10. Ubuntu系统下卸载命令apt-get remove/purge/autoremove/clean/autoclean的区别