1. 程式人生 > >Grandpa's Estate POJ - 1228

Grandpa's Estate POJ - 1228

pre 三個點 i++ blog close string 至少 ide 判斷

Grandpa‘s Estate

POJ - 1228

題意:給一些點,問能否唯一確定一個凸包。

先求凸包,當且僅當每條邊都至少三個點時可唯一確定一個凸包。

技術分享
 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 }
View Code

凸包一開始有個地方寫錯了,,判斷三個點的地方也一直有問題,最後還是看的別人的~

爆炸。。。

Grandpa's Estate POJ - 1228