程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> C語言 >> C++ >> C++入門知識 >> POJ 1228(穩定凸包)

POJ 1228(穩定凸包)

編輯:C++入門知識

  Language: Grandpa's Estate Time Limit: 1000MS Memory Limit: 10000K Total Submissions: 8990 Accepted: 2383 Description Kamran the Believer繼承了祖母的一個凸多邊形莊園. 莊園外圍用繩子和木樁圍起. 但一些繩子和木樁缺失了.幫忙看一下用剩余木樁圍起的莊園是否是穩定凸包(即剩下的釘子能確定一個唯一的凸包). Input   www.2cto.com 第一行一個數據組數 t (1 <= t <= 10).  對於每組數據,第一行為 n (1 <= n <= 1000) 表示木樁數. 接下來n行,每行為木樁坐標(x,y),保證整數. Output  對每組數據輸出YES 或 NO ,表示其是否穩定. Sample Input 1 6  0 0 1 2 3 4 2 0 2 4  5 0 Sample Output NO Source Tehran 2002 Preliminary 要想讓一個凸包穩定,當且僅當凸包上任意一條邊有3個以上的木樁(包括端點) 證明:   只要在建完凸包後,枚舉,邊上的第3點即可。 [cpp]   #include<cstdio>   #include<cstring>   #include<cstdlib>   #include<cmath>   #include<cctype>   #include<iostream>   #include<functional>   #include<algorithm>   using namespace std;   #define MAXT (10+10)   #define MAXN (1000+10)   //#define sqr( x ) (x*x)   int sqr(int x){return x*x;}   struct P   {       int x,y;       P(){}       P(int _x,int _y):x(_x),y(_y){}       friend istream& operator>>(istream &cin,P &a)       {           cin>>a.x>>a.y;return cin;       }       friend double dis(P a,P b)       {           return sqrt(double(sqr(a.x-b.x)+sqr(a.y-b.y)));       }   }a[MAXN];   struct V   {       int x,y;       V(){}       V(int _x,int _y):x(_x),y(_y){}       V(P a,P b):x(b.x-a.x),y(b.y-a.y){}       friend int operator*(V a,V b)       {           return a.x*b.y-a.y*b.x;       }   };   int cmp(P A,P B)   {       int temp=V(a[1],A)*V(a[1],B);       if (temp>0) return 1;       else if (temp==0&&dis(a[1],A)<dis(a[1],B)) return 1;       else return 0;         }   int t,n,st[MAXN];   bool solve()   {       int size=1;st[0]=1;       st[1]=1;       int j=2;       while (j<=n)       {           if (size<2||V(a[st[size-1]],a[st[size]])*V(a[st[size]],a[j])>0)           {               st[++size]=j++;           }           else size--;           }       a[++n]=a[1];       st[++size]=n;              for (int i=1;i<size;i++)       {       /*          int k=st[i-1]+1;          for (;k<st[i+1];k++)              if (k!=st[i]&&V(a[st[i]],a[st[i+1]])*V(a[st[i]],a[st[k]])==0) break;          if (k==st[i+1]) return 0;                     */           int k=1;           for (;k<n;k++)               if (k!=st[i]&&k!=st[i+1]&&V(a[st[i]],a[st[i+1]])*V(a[st[i]],a[k])==0) break;           if (k==n) return 0;        }              return size>=4;   }   int main()   {   //  freopen("poj1228.in","r",stdin);       cin>>t;       while (t--)       {           cin>>n;           for (int i=1;i<=n;i++) cin>>a[i];           if (n<6)           {               cout<<"NO\n";               continue;           }           int p=1;           for (int i=2;i<=n;i++) if (a[i].x<a[p].x||(a[i].x==a[p].x)&&(a[i].y<a[p].y)) p=i;           swap(a[1],a[p]);           sort(a+2,a+1+n,cmp);   //      cout<<dis(P(0,0),P(1,0))<<dis(P(0,0),P(1,0));           if (solve()) cout<<"YES\n";           else cout<<"NO\n";       }       return 0;   }     備注:不知為何,將sqr替換成define 結果會輸出"nan" 

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved