POJ1228 Grandpa's Estate 计算几何 唯一凸包的确定条件
来源:互联网 发布:vb会动的文字代码 编辑:程序博客网 时间:2024/05/20 02:28
题意: :给定凸包的几个点 还有几个点未知 也许在边上 也许是顶点 问 已知的这几个点是否确定了一个唯一的凸包 (因为可能是多种凸包)
分析: 两个点确定一条直线 而凸包的一条边至少要三个点才能确定 想想为什么呢 我们用ANdrew算法求凸包的思想是什么 三个点构成一个左转 下面看一个图
如图 假设: 输入的点是 A ,B ,C,a,b。 未知的点是 c, E;
在AC边上有三个点确定了唯一的一条边 假设 AC边 下还有一点F 无论F点放在哪里都不满足凸包的定义 所以 A,b,C三点确定了凸包的一条边。
同理 BC边也一样 。
但是 AB边就不一样了 因为只要选择的点在AB边的斜上方 或者AB边上都能满足凸包的定义 。
所以 至少三个点才能确定凸包的一条边 当然也可以是N多个点在同一直线上了
还有一点就是至少六个点才呢个确定一个唯一的凸包 这个应该不难想
懂了这了 这道题就迎刃而解了 下面看代码 写得不是很简洁
#include<cstdio>#include<cstring>#include<cmath>#include<algorithm>using namespace std;const int maxn = 1005;struct Point{ int x,y;}s[maxn],str[maxn];typedef struct Point point;int cmp(point a,point b){ if(a.x<b.x)return 1; else if(a.x == b.x && a.y < b.y)return 1; return 0;}int Cross(point p1, point p2,point p0){ int det = (p1.x-p0.x)*(p2.y-p0.y)-(p1.y-p0.y)*(p2.x-p0.x); if(det < 0)return 1; else if(det == 0)return 0;//三点共线 return -1;}int Solve(int m, point *ch){ int ans = 2; for(int i = 2; i < m; i++) { while(Cross(ch[i-1],ch[i],ch[i-2])==0) { i++; ans++; } if(ans >= 3)ans = 2; else return 0; } return 1;}int ConvexHull(point *s,int n,point *ch){ int m = 0,ans =1; for(int i = 0; i < n; i++) { while(m >1 && Cross(ch[m-1],s[i],ch[m-2])< 0)m--; ch[m++] = s[i]; } int k = m; for(int i = n-2; i >=0; i--) { while(m > k && Cross(ch[m-1],s[i],ch[m-2]) < 0)m--; ch[m++] = s[i]; } return m;}int main(){ #ifdef LOCAL freopen("in.txt","r",stdin); #endif // LOCAL int T; scanf("%d",&T); while(T--) { int N; scanf("%d",&N); for(int i = 0; i < N; i++) scanf("%d%d",&s[i].x,&s[i].y); if(N < 6)//至少6个点才能确定一个唯一的凸包 {puts("NO");continue;} sort(s,s+N,cmp); int m = ConvexHull(s,N,str); int n = Solve(m,str); if(n)puts("YES"); else puts("NO"); }}
- POJ1228 Grandpa's Estate 计算几何 唯一凸包的确定条件
- POJ1228——Grandpa's Estate(计算几何,凸包)
- POJ1228 Grandpa's Estate 还是凸包
- POJ1228-Grandpa's Estate(凸包)
- poj1228 Grandpa's Estate 凸包
- poj1228 Grandpa's Estate(凸包)
- [POJ1228]Grandpa's Estate(凸包)
- 【稳定凸包】poj1228 Grandpa's Estate
- POJ 1228 Grandpa's Estate 【计算几何:凸包,andrew】
- Grandpa's Estate(poj1228稳定的凸包)
- poj1228 Grandpa's Estate【凸包稳定性判断】
- POJ1228 Grandpa's Estate
- poj1228 - Grandpa's Estate
- POJ1228--Grandpa's Estate
- POJ1228-Grandpa's Estate
- Poj1228 Grandpa's Estate
- poj1228-Grandpa's Estate 带边上节点的凸包(稳定凸包)问题
- poj 1228 Grandpa's Estate(凸包)
- linux sysvinit与upstart(1)
- 行链接(Row chaining) 与行迁移(Row Migration)
- MYSQL查询一段时间
- 算法入门经典--二叉树
- Memcached实施心得
- POJ1228 Grandpa's Estate 计算几何 唯一凸包的确定条件
- struts2工作原理
- Chrome不值得拥有的和值得拥有的
- js替换所有的方法,js正则替换所有
- 高效率编辑器 VIM-操作篇,非常适合 VIM 新手
- C语言的谜题
- 找质数算法(Sieve of Eratosthenes筛法)
- shellSort
- 加班和效率