就是给你一堆点,看这些点能否构成一个 稳定的凸包。
凸包每条边上有3个及以上的点就可以了。
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
1 #include <cstdio> 2 #include <cstring> 3 #include <cmath> 4 #include <iostream> 5 #include <iomanip> 6 #include <algorithm> 7 #include <vector> 8 typedef double db; 9 const db eps = 1e-6; 10 const db pi = acos(-1); 11 using namespace std; 12 int sign(db k){ 13 if (k>eps) return 1; else if (k<-eps) return -1; return 0; 14 } 15 int cmp(db k1,db k2){return sign(k1-k2);} 16 int inmid(db k1,db k2,db k3){return sign(k1-k3)*sign(k2-k3)<=0;}// k3 在 [k1,k2] 内 17 struct point{ 18 db x,y; 19 point operator + (const point &k1) const{return (point){k1.x+x,k1.y+y};} 20 point operator - (const point &k1) const{return (point){x-k1.x,y-k1.y};} 21 point operator * (db k1) const{return (point){x*k1,y*k1};} 22 point operator / (db k1) const{return (point){x/k1,y/k1};} 23 bool operator <(const point &k1)const { 24 int c=cmp(x,k1.x); 25 if(c)return c==-1; 26 return cmp(y,k1.y)==-1; 27 } 28 }; 29 int inmid(point k1,point k2,point k3){return inmid(k1.x,k2.x,k3.x)&&inmid(k1.y,k2.y,k3.y);} 30 db cross(point k1,point k2){return k1.x*k2.y-k1.y*k2.x;} 31 db dot(point k1,point k2){return k1.x*k2.x+k1.y*k2.y;} 32 vector<point> convexHull(vector<point>ps){ 33 int n = ps.size();if(n<=1)return ps; 34 sort(ps.begin(),ps.end()); 35 vector<point> qs(n*2);int k=0; 36 for(int i=0;i<n;qs[k++]=ps[i++]) 37 while (k>1&&cross(qs[k-1]-qs[k-2],ps[i]-qs[k-2])<=0)--k; 38 for(int i=n-2,t=k;i>=0;qs[k++]=ps[i--]) 39 while (k>t&&cross(qs[k-1]-qs[k-2],ps[i]-qs[k-2])<=0)--k; 40 qs.resize(k-1); 41 return qs; 42 } 43 vector<point> v; 44 int t,n; 45 point p[1005]; 46 point tmp; 47 int main(){ 48 scanf("%d",&t); 49 while (t--){ 50 scanf("%d",&n); 51 for(int i=1;i<=n;i++){ 52 scanf("%lf%lf",&tmp.x,&tmp.y); 53 v.push_back(tmp); 54 p[i]=tmp; 55 } 56 v=convexHull(v); 57 int m = v.size(); 58 bool f=1; 59 for(int i=0;i<m;i++){ 60 int cnt=0; 61 for(int j=1;j<=n;j++){ 62 if(inmid(v[i],v[(i+1)%m],p[j])){ 63 cnt++; 64 } 65 } 66 if(cnt<3){ 67 f=0; 68 break; 69 } 70 } 71 if(v.size()<=2)f=0; 72 if(f)printf("YES "); 73 else printf("NO "); 74 v.clear(); 75 } 76 }