题解
2024-03-19 20:34:58
发布于:陕西
2阅读
0回复
0点赞
#include<bits/stdc++.h>
#define int long long
using namespace std;
int T;
struct point{//点
int x,y;
bool operator ==(const point rees)const{
return x==rees.x&&y==rees.y;
}
};
struct lll{//线
point l,r;
bool operator ==(const lll rees)const{
return (l==rees.l&&r==rees.r)||(l==rees.r&&r==rees.l);
}
}a,b,c;
int lenf(lll s){//长度的平方
return (s.l.x-s.r.x)*(s.l.x-s.r.x)+(s.l.y-s.r.y)*(s.l.y-s.r.y);
}
bool sdgx(point aa,point bb,point cc){//判断三点是否共线
if((cc.y-aa.y)*(bb.x-aa.x)==(bb.y-aa.y)*(cc.x-aa.x)) return true;//叉积
return false;
}
bool on(point cccc,lll aa){//一个点是否在线段上
if((cccc.x-aa.l.x)*(cccc.x-aa.r.x)>0) return false;
if((cccc.y-aa.l.y)*(cccc.y-aa.r.y)>0) return false;
if(!sdgx(aa.l,aa.r,cccc)) return false;
return true;
}
bool a1,a2,a3,a4,a5,a6,a7,a8,a9,a10,a11,a12;
signed main(){
scanf("%lld",&T);
while(T--){
scanf("%lld %lld %lld %lld %lld %lld %lld %lld %lld %lld %lld %lld",&a.l.x,&a.l.y,&a.r.x,&a.r.y,&b.l.x,&b.l.y,&b.r.x,&b.r.y,&c.l.x,&c.l.y,&c.r.x,&c.r.y);
if(a==b||b==c||c==a){//有两个(三个)一模一样的线段
printf("NO\n");
continue;
}
if(a.l==a.r||b.l==b.r||c.l==c.r){//a(或者b,c)不是一条线段
printf("NO\n");
continue;
}
a1=(a.l==b.l);
a2=(a.l==b.r);
a3=(a.l==c.l);
a4=(a.l==c.r);
a5=(a.r==b.l);
a6=(a.r==b.r);
a7=(a.r==c.l);
a8=(a.r==c.r);
a9=(b.l==c.l);
a10=(b.l==c.r);
a11=(b.r==c.l);
a12=(b.r==c.r);
//判断哪两个线段有公共端点
int ggdds=a1+a2+a3+a4+a5+a6+a7+a8+a9+a10+a11+a12;
if(ggdds>=2||ggdds==0){
printf("NO\n");//特判三角形,没有公共顶点的线段等情况
continue;
}
if(a2) swap(b.l,b.r);
if(a3) swap(b,c);
if(a4) swap(c.l,c.r),swap(b,c);
if(a5) swap(a.l,a.r);
if(a6) swap(a.l,a.r),swap(b.l,b.r);
if(a7) swap(a.l,a.r),swap(b,c);
if(a8) swap(a.l,a.r),swap(c.l,c.r),swap(b,c);
if(a9) swap(a,c);
if(a10) swap(c.l,c.r),swap(a,c);
if(a11) swap(a,c),swap(b.l,b.r);
if(a12) swap(c.l,c.r),swap(b.l,b.r),swap(a,c);
//这里可以保证a.l==b.l
if(lenf(a)+lenf(b)<lenf((lll){a.r,b.r})) printf("NO\n");//由余弦定理判定是否为钝角
else if(sdgx(a.l,a.r,b.r)) printf("NO\n");
else{
if(!(on(c.l,a)||on(c.l,b))) printf("NO\n");//c.l不在a或b上
else if(!(on(c.r,a)||on(c.r,b))) printf("NO\n");//c.r不在a或b上
else if(on(c.l,a)&&on(c.r,a)) printf("NO\n");//c与a重合
else if(on(c.l,b)&&on(c.r,b)) printf("NO\n");//c与b重合
else{
if(on(c.r,a)) swap(c.l,c.r);
//这里可以保证c.l在a上,c.r在b上
int u=lenf((lll){a.l,c.l}),d=lenf((lll){a.r,c.l});
if(u>d*16||u*16<d){
printf("NO\n");
continue;
}
u=lenf((lll){b.l,c.r}),d=lenf((lll){b.r,c.r});
if(u>d*16||u*16<d){
printf("NO\n");
continue;
}
printf("YES\n");
}
}
}
return 0;
}
这里空空如也
有帮助,赞一个