【POJ 2187】如何修改Graham算法,才能使之顺利解决三点一条直线的问题。
暑期集训中做了 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. 题目 2. Python求解 3. 作业纸上的描述 1. 题目 一个正三角形平面,边长为1,在三个角的部分减去一个四边形,然后沿着剪开部分折叠起来,该怎么剪,才能使折叠后的三棱台体积最 ...
- [Poj 2187] 计算几何之凸包(二) {更高效的算法}
{ 承上一节 继续介绍点集的凸包 (下文中所有凸包 若不做特殊说明均指点集的凸包) 这一节介绍相比更高效的算法 } ========================================= ...
- HDUOJ 1392凸包graham算法
#include <iostream> #include <cstdio> #include <cstring> #include <cmath> #i ...
- poj 2187 Beauty Contest(凸包求解多节点的之间的最大距离)
1 /* poj 2187 Beauty Contest 2 凸包:寻找每两点之间距离的最大值 3 这个最大值一定是在凸包的边缘上的! 4 5 求凸包的算法: Andrew算法! 6 */ 7 #in ...
- 格式工厂转换视频怎样设置才能使视频大小缩小
格式工厂转换视频怎样设置才能使视频大小缩小 1.设置屏幕大小 2.对比特率进行更改(说明:采样率在一定特殊情况下也可进行修改,只是记得转换完成后,浏览查看,可能会有声音出不来的情况.如果出现,采样率还 ...
- 【知识积累】CS4.4绕过vultr特征检测修改checksum8算法
前言 众所周知,关于cs相关的资料都非常的少,并且是打得特别紧,特别是这两年各个安全厂商对cs相关的内容都给予了特征识别等严重的打击,例如vultr网站会检测特征并关停服务器,我们可以同个多种方式更改 ...
- 【计算几何】凸包之graham算法(适合小白)
计算几何–凸包(graham算法实现) 题目链接:LeetCode587 https://leetcode-cn.com/problemset/all/ 题目描述 在一个二维的花园中,有一些用 (x, ...
- 4、路由器和主机如何配置IP地址等信息才能使计算机相互通信
文章目录 一.路由器和主机配置 1.路由器配置 ①路由器以太网口配置 ②路由器串口配置 ③路由器静态路由配置 方法一:网络路由 方法二:汇总路由1 方法三:汇总路由2 方法四:默认路由 2.主机配置 ...
- 三插头内部结构图_三方面维护硬度计才能使寿命更长久
硬度计是光机电一体化的高新技术产品.与其他精密仪器一样,定期的保养维护少不了.轻则导致操作不顺畅,或试验结果有偏差;重则机器损坏,返厂维修耽误时间又费钱.如何才能使用寿命才能更长?现在为大家介绍一下在 ...
最新文章
- 适合初学者学java技术的书籍推荐!
- android 代码设置 键盘适应_Android自适应软键盘的Dialog以及监听软键盘弹起
- 图的单源最短路径:Dijkstra算法实现
- Ubuntu中设置静态IP和DNS
- C语言中,带空格的字符串输入
- 读取位置 0x00000028 时发生访问冲突该怎么解决
- python如何使用图片做背景_用Python批量给照片换底色,基于opencv模块
- python如何离线安装第三方模块_扣丁学堂python开发之第三方模块pip离线安装
- 网络分流器|运营商光纤延距解决方案
- [Android] 输入系统(二)
- POJ2481-Cows【树状数组】
- java程序员技术_JAVA程序员需要懂得哪些技术
- 效率工具:分享7款实用的任务管理软件,值得收藏!
- java工程师容易秃头吗_程序员更容易秃头?原因是什么?
- Mesh Slicer 切割人体的原理分析
- 用计算机弹的数字,在计算器上弹两只老虎是用那几个数字
- 科研论文翻译软件|无广告|强力推荐
- 微软出品:.net 微服务:容器化.net架构指南
- [iOS]转让APP
- Python3的桌面程序开发利器:Eric6的环境搭建、使用
热门文章
- Qt QlineEdit 限制输入中文和中文字符(允许英文及英文字符)
- R语言-模型拟合及预测(新数据集)常见问题及解决方案
- 万象:SpaceX 火箭回收的失败案例汇总
- OSI七层模型、TCP/IP五层(或四层)模型
- GO(golang)语言使用SMTP发送电子邮件,简单和复杂带附件cc,bcc
- 酷派8150S(移动定制版)可用的第三方Recovery备份数据、刷机并精简系统内置APK经验...
- 机器视觉-相机标定及畸变矫正
- android悬浮窗跑马灯,边缘闪光跑马灯
- 高新技术企业申请,申请高新技术企业需要什么材料
- Ubuntu系统下卸载命令apt-get remove/purge/autoremove/clean/autoclean的区别