#include<iostream> using namespace std; typedef struct Piont { double x,y; }point; typedef struct Cfx { point p[5]; }cfx; typedef struct Zx { point pq[3]; }zx; int max(int x,int y) { return x>y? x:y; } int min(int x,int y) { return x<y? x:y; } double multi(point p0,point p1,point p2)//计算矢量[p0,p1], [p0,p2] 的叉积 { return (p1.x-p0.x)*(p2.y-p0.y) -(p2.x-p0.x)*(p1.y-p0.y); } bool is_cross(point s1,point e1,point s2,point e2)//判断线段相交 { return max(s1.x,e1.x)>=min(s2.x,e2.x)&& max(s2.x,e2.x)>=min(s1.x,e1.x)&& max(s1.y,e1.y)>=min(s2.y,e2.y)&& max(s2.y,e2.y)>=min(s1.y,e1.y)&& multi(s2,e1,s1)*multi(e1,e2,s1)>=0&& multi(s1,e2,s2)*multi(e2,e1,s2)>=0; } int main() { int n,i; zx z; cfx c; cin>>n; while(n--) { bool ans=false; cin>>z.pq[1].x>>z.pq[1].y>>z.pq[2].x>>z.pq[2].y >>c.p[1].x>>c.p[1].y>>c.p[3].x>>c.p[3].y; c.p[2].x=c.p[1].x; c.p[2].y=c.p[3].y; c.p[4].x=c.p[3].x; c.p[4].y=c.p[1].y; for(i=2;i<=4;i++) { if(is_cross(z.pq[1],z.pq[2],c.p[i-1],c.p[i])) ans=true; } if(is_cross(z.pq[1],z.pq[2],c.p[1],c.p[4])) ans=true; if( min(z.pq[1].x,z.pq[2].x)>=min(c.p[1].x,c.p[3].x) &&max(z.pq[1].x,z.pq[2].x)<=max(c.p[1].x,c.p[3].x) &&min(z.pq[1].y,z.pq[2].y)>=min(c.p[1].y,c.p[3].y) &&max(z.pq[1].y,z.pq[2].y)<=max(c.p[1].y,c.p[3].y))//直线在长方形内部也是相交的一种特殊情况 ans=true; if(ans) cout<<"T"<<endl; else cout<<"F"<<endl; } system("pause"); return 0; } http://acm.pku.edu.cn/JudgeOnline/problem?id=1410