 /**//*
題意:求是否存在一條直線,使所有線段到這條直線的投影至少有一個(gè)交點(diǎn)
可以在共同投影處作原直線的垂線,則該垂線與所有線段都相交
<==> 是否存在一條直線與所有線段都相交

可以枚舉線段的端點(diǎn)作為直線的(注意如果相同構(gòu)不成直線)
然后判斷所有線段是否都與之相交

這種做法我也不是很懂,可能這條直線能將所有點(diǎn)分成位于直線兩端的兩部分吧
*/
#include<cstdio>
#include<cstdlib>
#include<cmath>

const double esp=1e-8;
const int MAXN=210;

 struct Point {
double x,y;
}points[MAXN];

 bool isEqual(double &a,double &b) {
return fabs(a-b)<esp;
}
 double mul(Point &a,Point &b,Point &o) {
return (a.x-o.x)*(b.y-o.y)-(b.x-o.x)*(a.y-o.y);
}
 int main() {
//freopen("in","r",stdin);
int T,n;
scanf("%d",&T);
 while(T--) {
scanf("%d",&n);
for(int i=1;i<=2*n;i+=2)
scanf("%lf%lf%lf%lf",&points[i].x,&points[i].y,&points[i+1].x,&points[i+1].y);

bool flag=false;
for(int i=1;i<=2*n&&!flag;i++)//enum line
 for(int j=1;j<=2*n;j++) {
Point p1=points[i],p2=points[j];
if(isEqual(p1.x,p2.x)&&isEqual(p1.y,p2.y))continue;
//chk
int k;
for(k=1;k<=2*n;k+=2)
if(mul(points[k],p1,p2)*mul(points[k+1],p1,p2)>esp)break;
 if(k>=2*n) {flag=true;break;}
}
printf(flag?"Yes!\n":"No!\n");
}
return 0;
}

|