Grandpa's Estate POJ - 1228
Posted yijiull
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Grandpa's Estate POJ - 1228相关的知识,希望对你有一定的参考价值。
Grandpa‘s Estate
题意:给一些点,问能否唯一确定一个凸包。
先求凸包,当且仅当每条边都至少三个点时可唯一确定一个凸包。
1 #include <cstdio> 2 #include <cstring> 3 #include <iostream> 4 #include <algorithm> 5 using namespace std; 6 const int maxn=1010; 7 8 struct Node{ 9 int x,y; 10 bool operator < (const Node& a)const{ 11 return x<a.x||x==a.x&&y<a.y; 12 } 13 Node operator - (Node& a){ 14 return Node{x-a.x,y-a.y}; 15 } 16 }p[maxn],ch[maxn]; 17 18 int cross(Node a,Node b){ 19 return a.x*b.y-a.y*b.x; 20 } 21 int ConvexHull(int n){ 22 if(n<6) return 0; 23 int m=0; 24 for(int i=0;i<n;i++){ 25 while(m>1&&cross(ch[m-1]-ch[m-2],p[i]-ch[m-2])<=0) m--; 26 ch[m++]=p[i]; 27 } 28 int k=m; 29 for(int i=n-2;i>=0;i--){ 30 while(m>k&&cross(ch[m-1]-ch[m-2],p[i]-ch[m-2])<=0) m--; 31 ch[m++]=p[i]; 32 } 33 m--; 34 ch[m+1]=ch[0]; 35 int i,j; 36 for(i=0;i<m;i++){ 37 for(j=0;j<n;j++){ 38 if((ch[i].x!=p[j].x||ch[i].y!=p[j].y)&&(ch[i+1].x!=p[j].x||ch[i+1].y!=p[j].y)){ 39 if((ch[i].x-p[j].x)*(p[j].x-ch[i+1].x)>=0&&cross(ch[i]-ch[i+1],ch[i+1]-p[j])==0) break; 40 } 41 } 42 if(j==n) break; 43 } 44 return i>=m; 45 } 46 int main(){ 47 int t,n; 48 scanf("%d",&t); 49 while(t--){ 50 scanf("%d",&n); 51 for(int i=0;i<n;i++) scanf("%d%d",&p[i].x,&p[i].y); 52 sort(p,p+n); 53 int ans=ConvexHull(n); 54 if(ans) puts("YES"); 55 else puts("NO"); 56 } 57 return 0; 58 }
凸包一开始有个地方写错了,,判断三个点的地方也一直有问题,最后还是看的别人的~
爆炸。。。
以上是关于Grandpa's Estate POJ - 1228的主要内容,如果未能解决你的问题,请参考以下文章
Grandpa's Estate---POJ1228(凸包)