题目来源呢,是 UVA191考题。
题目链接
怎么说呢,题目意思还算简洁,数据也限定在正整数不然若是浮点数用上了double误差允许范围内判等 或是 坐标出现负数,那代码就还有的改咯。
另外,参考了一下大牛的解法,贴上地址~
判断两线段是否相交
#include
#include
using namespace std;
struct point{//点结构体
int x,y;
point(int a=0,int b=0){
x=a; y=b;}//给点赋坐标值
};
int direction(point p1,point p2,point p3){//二维矩阵
return ( (p2.x-p1.x)*(p3.y-p1.y) - (p3.x-p1.x)*(p2.y-p1.y));
}//返回的是向量p1p2与p1p3叉积结果
bool checkPointOnLine(point p1,point p2,point p3){//利用坐标大小判断p3是否在线段p1p2
if( p3.x< min(p1.x,p2.x) || p3.x> max(p1.x,p2.x) || p3.y< min(p1.y,p2.y) || p3.y> max(p1.y,p2.y))
return false;
else
return true;
}//reue的条件为 (p3.x>= min(p1.x,p2.x) && p3.x<= max(p1.x,p2.x) && p3.y>=min(p1.y,p2.y) && p3.y<= max(p1.y,p2.y))
bool checkIntersection(point p1,point p2,point p3, point p4){//线在矩形外,判断相交
int d1,d2,d3,d4;
d1 = direction(p3,p4,p1);//p3p4 and p3p1
d2 = direction(p3,p4,p2);//p3p4 and p3p2
//根据叉积几何意义判断两条线段相交知:若d1与d2异号则点p1、p2分居在向量p3p4两侧,即是p1p2与p3p4相交
d3 = direction(p1,p2,p3);//p1p2 and p1p3
d4 = direction(p1,p2,p4);//p1p2 and p1p4
//同理,异号时p3、p4分居向量p1p2
//cout << d1 << " " << d2 <<" " << d3 << " " << d4 << endl;
if((d1*d2<0) && (d3*d4<0))
return true;//Intersecting!
else if((d1 == 0)&&( checkPointOnLine(p3,p4,p1)))//这一行代码说明p3p4与p1p2相交,至少有交点p1(其实已经共线了),以下同理
return true;
else if((d2 == 0)&&( checkPointOnLine(p3,p4,p2)))
return true;
else if((d3 == 0)&&( checkPointOnLine(p1,p2,p3)))
return true;
else if((d4 == 0)&&( checkPointOnLine(p1,p2,p4)))
return true;
else
return false;
}
//线段(pa,pb)在矩形p1p3的内部,必相交
bool segmentInRectangle(point p1,point p3,point pa,point pb){//p1、p3表示矩形的上下两个端点(由于题目说此两点不分顺序故需先判断后取大小)
if( (min(p1.x,p3.x) <= pa.x && pa.x <= max(p1.x,p3.x)) &&
(min(p1.y,p3.y) <= pa.y && pa.y <= max(p1.y,p3.y)) &&
(min(p1.x,p3.x) <= pb.x && pb.x <= max(p1.x,p3.x)) &&
(min(p1.y,p3.y) <= pb.y && pb.y <= max(p1.y,p3.y)) )
return true;
else
return false;
}
inline void gameOver(){
point pa,pb;//线段端点
point p1,p3;//输入的矩形两个对角端点
point p2,p4;//矩形的另外两对角端点
int xa,ya,xb,yb,x1,y1,x3,y3;
scanf("%d%d %d%d %d%d %d%d",&xa,&ya,&xb,&yb,&x1,&y1,&x3,&y3);
pa = point(xa,ya); pb = point(xb,yb);
p1 = point(x1,y1); p3 = point(x3,y3);
p2 = point(x1,y3); p4 = point(x3,y1);
if( segmentInRectangle(p1,p3,pa,pb) ||
checkIntersection(p1,p2,pa,pb) ||
checkIntersection(p3,p4,pa,pb) ||
checkIntersection(p3,p2,pa,pb) ||
checkIntersection(p1,p4,pa,pb) ) printf("T\n");
else
printf("F\n");
}
int main(){
int n;
scanf("%d",&n);
while(n--){
gameOver();
}
return 0;
}
待更,持续更新中……