2139: 德莱联盟
时间限制: 1 Sec 内存限制: 64 MB提交: 7 解决: 3
您该题的状态:已完成
[提交][状态][讨论版]
题目描述
欢迎来到德莱联盟。。。。
德莱文。。。
德莱文在逃跑,卡兹克在追。。。。
我们知道德莱文的起点和终点坐标,我们也知道卡兹克的起点和 终点坐标,问:卡兹克有可能和德莱文相遇吗?,并且保证他们走的都是直线。
输入
几组数据,一个整数T表示T组数据 每组数据 8个实数,分别表示德莱文的起点和终点坐标,以及卡兹克的起点和终点坐标
输出
如果可能 输出 Interseetion,否则输出 Not Interseetion
样例输入
2
-19.74 7.14 22.23 -27.45 -38.79 -5.08 47.51 34.01
-8.61 9.91 -32.47 6.47 -3.81 -16.1 7.82 -6.37
样例输出
Interseetion
Not Interseetion
一个简单的判断两条线段是否相交的问题,不知道如何判断两条线段是否相交的请看:
#include <stdio.h>
#define PY printf("Interseetion\n")
#define PN printf("Not Interseetion\n")
struct Node {
double x;
double y;
};
//判断直线AB是否与线段CD相交
bool lineInSide( Node A, Node B, Node C, Node D) {
// A(x1, y1), B(x2, y2)的直线方程为:
// f(x, y) = (y - y1) * (x1 - x2) - (x - x1) * (y1 - y2) = 0
double fC = (C.y - A.y) * (A.x - B.x) - (C.x - A.x) * (A.y - B.y);
double fD = (D.y - A.y) * (A.x - B.x) - (D.x - A.x) * (A.y - B.y);
if(fC * fD > 0)
return false;
return true;
}
//判断线段AB和线段CD是否相交
bool sideInSide( Node A, Node B, Node C, Node D) {
if(!lineInSide(A, B, C, D))
return false;
if(!lineInSide(C, D, A, B))
return false;
return true;
}
int main() {
int t;
Node s1,s2,e1,e2;
scanf( "%d",&t );
while( t-- ) {
scanf( "%lf%lf%lf%lf%lf%lf%lf%lf",&s1.x,&s1.y,&e1.x,&e1.y,&s2.x,&s2.y,&e2.x,&e2.y );
if( sideInSide( s1,e1,s2,e2 ) )
PY;
else
PN;
}
}
有其他想法欢迎留言讨论哦