题意:问存不存在一条直线,各个线段在直线上的投影有公共部分,也就是判断是否存在一条直线将所有线段都相交。
枚举所有端点构成的直线如果有一条直线相交所有线段那么就存在。
#include <iostream> #include<cstdio> #include<cstring> #include<algorithm> #include<cmath> using namespace std; #define eps 1e-8 typedef double PointType; struct point { PointType x,y; }; PointType Direction(point pi,point pj,point pk) //判断向量PiPj在向量PiPk的顺逆时针方向 +顺-逆0共线 { return (pj.x-pi.x)*(pk.y-pi.y)-(pk.x-pi.x)*(pj.y-pi.y); } int main() { int t,n; point data[405]; scanf("%d",&t); while(t--) { scanf("%d",&n); for(int i=0; i<n*2; i+=2) scanf("%lf%lf%lf%lf",&data[i].x,&data[i].y,&data[i+1].x,&data[i+1].y); int ans=0; for(int i=0; i<2*n; i++) { for(int j=i+1; j<2*n; j++) { if(fabs(data[i].x-data[j].x)>eps||fabs(data[i].y-data[j].y)>eps) { ans=1; for(int k=0; k<n*2; k+=2) { double d1=Direction(data[i],data[j],data[k]); double d2=Direction(data[i],data[j],data[k+1]); if(d1*d2>0) { ans=0; break; } } } if(ans) break; } if(ans) break; } if(ans) puts("Yes!"); else puts("No!"); } return 0; }