POJ 1228 Grandpa's Estate

这是个好题目,同时也是个不和谐的题目(不和谐原因是题目出的存在漏洞,数据弱,而且有些条件没给清楚,为了一个SB错误无限WA之后,终于AC)

题意就废了我好长时间,唉……英语不好的鸭梨大……

大意就是爷爷留了块土地给我,然而这块土地是以一些钉子来界定的,题目要做的就是给你一堆钉子的坐标(也就是凸包上部分的点),然后问你能不能唯一确定这块土地。

问了下度娘,这个问题叫做“稳定”凸包问题,那么首先就要了解下“稳定”凸包的性质:(在此感谢XDruid博主)

比方说有4个点:

这4个点可以围成一个凸包,但是原始的凸包可能并不是这个样子的

例如可能是这个样子:

这样我们则称这4个点确定的凸包是”不稳定“的!

那么怎么样才叫稳定呢?

是这个样子:想一想,若像刚才一样,在直线外面加一个点,那么线上的点必定不会属于凸包,要删掉,是吧?

如此以来,问题就很明确了,算法也随之而来了:

我们已经知道了怎么求凸包了(前提),这样一来,只要判断是否有3点或N>=3点共线就可以了~~

表示用的是Graham的变种Andrew……感觉真的很好用:

下面贴代码:

View Code

#include <cstdio>
#include <algorithm>
#include <cmath>
using namespace std;const double EPS = 1e-6;struct point{double x , y;
} p[1010] , chn[1010];bool cmp (point a , point b)
{return (a.y < b.y || (a.y == b.y && a.x < b.x));
}double xmult(point p1 , point p2 , point p3)
{return ((p1.x - p3.x) * (p2.y - p3.y) - (p1.y - p3.y) * (p2.x - p3.x));
}int andrew(int n)
{int len , top = 1;chn[0] = p[0];chn[1] = p[1];for (int i = 2 ; i < n ; i ++){while (top && xmult(p[i] , chn[top] , chn[top - 1]) > EPS) top --;chn[++ top] = p[i];}len = top;chn[++ top] = p[n - 2];for (int i = n - 3 ; i >= 0 ; i --){while (top != len && xmult(p[i] , chn[top] , chn[top - 1]) > EPS) top --;chn[++ top] = p[i];}return top;
}bool judge(int n)  //解释请看下面
{for (int i = 1 ; i < n ; i ++){if ((xmult(chn[i - 1] , chn[i] , chn[i + 1]) != 0) && (xmult(chn[i] , chn[i + 1] , chn[i + 2]) != 0))return false;}return true;
}int main()
{int T , n;scanf("%d" , &T);while (T --){scanf("%d" , &n);for (int i = 0 ; i < n ; i ++) scanf("%lf%lf" , &p[i].x , &p[i].y);if (n < 6) printf("NO\n");else{sort(p , p + n , cmp);int top = andrew(n);if (judge(top)) printf("YES\n");else printf("NO\n");}}return 0;
}

写了这个题后,对凸包的理解真是加深了。

同时,在被WA了N此后(主要是因为读入数据要用double。但是题目上说是整点啊!不明白,如果没看到别人的解题报告,估计要一直WA下去)

昨晚在无限WA后找了XxX师兄,开始以为思路错了,经过他的问答,对这个题目的理解更是加深了!

下面说下代码中【judge】函数的判断原因:

理论支持:叉积 = 0 说明共线!

我们用Andrew算法求出凸包后(栈内不删去共线的点)这些点已经是按一定顺序排好了的~

然后之需要对栈内的点进行叉积判断就可以了~~ 只有当向左与向中间扩展都不满足是,才说明当前点不满足!

所以只要有一个不满足,则说明全部不满足了。

做了这个题目,我对之前提出的疑问有了答案。哈哈~~

转载于:https://www.cnblogs.com/hmhard/archive/2013/02/07/2908860.html

POJ 1228 —— “稳定”凸包相关推荐

  1. Grandpa's Estate POJ - 1228(凸包极角序改写)

    看了题目意思之后感觉哇,简单的 一批不就是判断线段之间有没有至少一个点嘛,,,,,结果wa到自闭,, 这个题的点有首先要根据点构造凸包,因为题目给的数据不一定是一个凸包,其次,我们在构造凸包极角排序的 ...

  2. POJ 1228 Grandpa's Estate --深入理解凸包

    题意: 判断凸包是否稳定. 解法: 稳定凸包每条边上至少有三个点. 这题就在于求凸包的细节了,求凸包有两种算法: 1.基于水平序的Andrew算法 2.基于极角序的Graham算法 两种算法都有一个类 ...

  3. “稳定”凸包----poj1228

       题目链接: http://poj.org/problem?id=1228    这道题算是很好的一道凸包的题吧,做完后会加深对凸包的理解.    题意很关键...这英语看了好几遍才差不多看明白了 ...

  4. poj 1228 Grandpa's Estate 给定了一个凸包的部分顶点和边上的点,判断是否能唯一确定一个凸包...

    题目来源: http://poj.org/problem?id=1228 题意:题目输入一个凸包上的点(没有凸包内部的点,要么是凸包顶点,要么是凸包边上的点),判断这个凸包是否唯一.所谓唯一就是判断能 ...

  5. poj 1228 Grandpa's Estate

    题目衔接:http://poj.org/problem?id=1228 Time Limit: 1000MS   Memory Limit: 10000K Total Submissions: 168 ...

  6. poj 1113 Wall 凸包的应用

    题目链接:poj 1113   单调链凸包小结 题解:本题用到的依然是凸包来求,最短的周长,只是多加了一个圆的长度而已,套用模板,就能搞定: AC代码: 1 #include<iostream& ...

  7. POJ1228(稳定凸包问题)

    题目:Grandpa's Estate   题意:输入一个凸包上的点(没有凸包内部的点,要么是凸包顶点,要么是凸包边上的点),判断这个凸包是否稳定.所谓稳 定就是判断能不能在原有凸包上加点,得到一个更 ...

  8. POJ 1584 计算几何 凸包

    链接: http://poj.org/problem?id=1584 题意: 按照顺时针或逆时针方向输入一个n边形的顶点坐标集,先判断这个n边形是否为凸包. 再给定一个圆形(圆心坐标和半径),判断这个 ...

  9. poj 1873 枚举+凸包

    题意:给出一些树的位置,价值,长度,现要求先砍一些树制成一定长度的篱笆将剩余的树围起来,求要砍树的最小总价值. 因为树的个数最多为15个很容易想到用二进制数表示树的状态进行遍历. #include&l ...

最新文章

  1. python皮同_Python OpenCV 图像的双线性插值算法,全网最细致的算法说明_橡皮擦,一个逗趣的互联网高级网虫-CSDN博客...
  2. 如何设置JVM使用的代理
  3. Web前端开发笔记——第四章 JavaScript程序设计 第二节 变量
  4. 安装 java decompiler_Eclipse离线安装Java Decompiler插件(反编译)
  5. 如何用Pygame写游戏(九)
  6. python win10 arm_windows10 arm版下载-windows10arm镜像64位中文版 - 极光下载站
  7. 第12章[12.10.1] Ext JS + CKEditor+Spring Boot 实现编辑器图片上传
  8. setwindowpos怎么改变z序_Windows转Mac——操作习惯的改变!
  9. java 省份城市_如何用Java输入一个省份,然后列出这个省份所有城市的名字?
  10. 优科Ruckus R610 AP刷Unleashed固件
  11. spss系列——一元线性回归的分析与预测实例
  12. 高通开发-烧写及异常启动分析
  13. 西部陆海新通道海铁联运通达中国六省市
  14. 六类双绞线排序和信息插座排序
  15. 三十岁的男人应该有多少存款?
  16. Ubuntu20.04安装中国版firefox
  17. 计算机专业 大一课程,计算机专业大一课程
  18. 地雷復 (易經大意 韓長庚)
  19. fwrite php utf8,坚持通过PHP的fwrite编写UTF-8文件
  20. GNN论文周报 | 来自北航、中科院、MSRA、新加坡国立大学、慕尼黑工业大学等机构前沿论文研究...

热门文章

  1. 用Java编写约分最简公式,2013年Java方向C组第五题
  2. ACM卡常处理办法(虽然我到现在没遇到)
  3. [二叉树] 判断一个二叉树是否是平衡(剑指offer39)
  4. 图像bayer格式介绍以及bayer插值原理CFA
  5. C# 中的char 和 byte
  6. 感知算法论文(四):Mask Scoring R-CNN (2019)译文
  7. 机器学习 对模型进行惩罚_使用Streamlit对机器学习模型进行原型制作
  8. 1. face_generate.py
  9. 逻辑回归是分类还是回归_分类和回归:它们是否相同?
  10. 背账100万,不付利息不用还钱,银行套路好深