POJ 1228 Grandpa's Estate 判断原始凸包是否唯一
2012-09-02 22:20
405 查看
题意:给出一个去掉几个点后的凸包,判断剩下的几个点组成的新凸包是不是原来的那个凸包。
分析:只要 新凸包的每条边上有3个或3个以上的点时,凸包就是原来那个凸包,
否则凸包不是原来那个凸包。 很好理解的,不是很难想到。
View Code
分析:只要 新凸包的每条边上有3个或3个以上的点时,凸包就是原来那个凸包,
否则凸包不是原来那个凸包。 很好理解的,不是很难想到。
View Code
#include<stdio.h> #include<string.h> #include<math.h> #include<algorithm> using namespace std; #define eps 1e-8 struct point { int x, y; }p[1003]; int det(int x1, int y1, int x2, int y2) { return x1 * y2 - x2 * y1; } int cross(point o, point a, point b) { return det(a.x - o.x, a.y - o.y, b.x - o.x, b.y - o.y); } int dblcmp(double x) { if( fabs(x) < eps ) return 0; return x > 0 ? 1 : -1; } bool dot_on_seg(point a, point b, point c) // 判断 点c是否在线段ab上 //我cross写成了int的,注意转换,*1.0, WA点 { return ( dblcmp( cross(a, b, c)*1.0 ) == 0 )&& ( dblcmp( (c.x - b.x) * (c.x - a.x) * 1.0 ) <= 0 ); } bool cmp(point a, point b) { if(a.y == b.y) return a.x < b.x; return a.y < b.y; } point res[1003 << 1]; int n, top; void graham()//凸包,起点和终点是同一个点 { int i; sort(p, p + n, cmp); top = -1; res[++top] = p[0]; res[++top] = p[1]; for(i = 2; i < n; i++) { while(top >= 1 && cross(res[top-1], res[top], p[i]) <= 0) top--; res[++top] = p[i]; } res[++top] = p[n-2]; int t = top; for(i = n - 3; i >= 0; i--) { while(top >= t && cross(res[top-1], res[top], p[i]) <= 0) top--; res[++top] = p[i]; } //for(i = 0; i <= top; i++) // printf("%d %d\n", res[i].x, res[i].y); } bool judge() { if(n <= 5 || top == 1) return 0; int i, j; for(i = 0; i < top ; i++) { int cnt = 0; for(j = 0; j < n; j++) if( dot_on_seg( res[i], res[i+1],p[j]) ) cnt++; if(cnt < 3) return 0; } return 1; } int main() { int i, j, cas; scanf("%d", &cas); while(cas--) { scanf("%d", &n); for(i = 0; i < n; i++) scanf("%d%d", &p[i].x, &p[i].y); graham(); puts(judge() ? "YES" : "NO"); } return 0; }
相关文章推荐
- POJ 1228 判断原始凸包是否唯一
- POJ 1228 Grandpa's Estate(给定凸包上的一部分顶点 判断表示的凸包是否唯一)
- poj-1228 Grandpa's Estate(判断凸包是否唯一)
- POJ 1228 Grandpa's Estate(凸包唯一性判断)
- POJ 1228 Grandpa's Estate(判断是否稳定凸包)
- POJ 1228 Grandpa's Estate | 凸包
- 【POJ】1228 Grandpa's Estate(凸包)
- POJ 1228 Grandpa's Estate [稳定凸包]
- POJ 1228 Grandpa's Estate(凸包)
- [poj] 1228 Grandpa's Estate || 稳定凸包
- POJ 1228 Grandpa's Estate【稳定凸包判断】
- 【POJ 1228】Grandpa's Estate 凸包
- 简单几何(求凸包点数) POJ 1228 Grandpa's Estate
- poj 1228 Grandpa's Estate (稳定凸包问题)
- Grandpa's Estate - POJ 1228(稳定凸包)
- poj 1228 Grandpa's Estate 给定了一个凸包的部分顶点和边上的点,判断是否能唯一确定一个凸包
- poj 1228 Grandpa's Estate ( 凸包 )
- POJ 1228 Grandpa's Estate 计算凸包+判断点在线段上
- poj_1679_判断最小生成树是否唯一
- poj 1679 判断最小生成树是否唯一(kruskal)