#include<cstdio>
#include<cstdlib>
#include<cmath>
const double eps = 1e-8;
int n;
struct Pt {
double x, y;
Pt() { }
Pt(double x, double y) : x(x), y(y) { }
};
struct Sg {
Pt s, t;
Sg() { }
Sg(Pt s, Pt t) : s(s), t(t) { }
Sg(double a, double b, double c, double d) : s(a, b), t(c, d) { }
};
double norm(Pt p) { return sqrt(p.x*p.x + p.y*p.y); }
//double dist (Pt a, Pt b) { return (a-b).norm(); }
void print(Pt p) { printf("(%f, %f)", p.x, p.y); }
Sg seg[110];
double mult(Pt sp, Pt ep, Pt op){
return (sp.x-op.x)*(ep.y-op.y) - (ep.x-op.x)*(sp.y-op.y);
}
bool fun(Pt p1,Pt p2){
if(fabs(p1.x-p2.x)<eps&&fabs(p1.y-p2.y)<eps)
return false;
for(int i=0;i<n;++i){
if(mult(p1,p2,seg[i].s)*mult(p1,p2,seg[i].t)>eps)
return false;
}
return true;
}
int main(){
int t;
scanf("%d",&t);
while(t--){
scanf("%d",&n);
for(int i=0;i<n;++i){
scanf("%lf%lf%lf%lf",&seg[i].s.x,&seg[i].s.y,&seg[i].t.x,&seg[i].t.y);
}
bool flag=false;
if(n<3) flag=true;
for(int i=0;i<n&&!flag;++i){
for(int j=i+1;j<n&&!flag;++j){
if(fun(seg[i].s,seg[j].s)) flag=true;
else if(fun(seg[i].s,seg[j].t)) flag=true;
else if(fun(seg[i].t,seg[j].s)) flag=true;
else if(fun(seg[i].t,seg[j].t)) flag=true;
}
}
printf("%s\n",flag?"Yes!":"No!");
}
//system("pause");
return 0;
}
##总结
- 判断是否存在一条直线与所有线段相交,枚举任意两条线段,如果存在两条线段生成的四条直线与任意一条线段相交,则命题成立。

本文介绍了一种算法,用于判断是否存在一条直线能够与给定的所有线段相交。通过枚举每一对线段并检查由它们组成的四条直线是否与其它线段相交来实现。
260

被折叠的 条评论
为什么被折叠?



