1264 线段相交

1264 线段相交

 
给出平面上两条线段的两个端点,判断这两条线段是否相交(有一个公共点或有部分重合认为相交)。 如果相交,输出"Yes",否则输出"No"。
 
输入
第1行:一个数T,表示输入的测试数量(1 <= T <= 1000)
第2 - T + 1行:每行8个数,x1,y1,x2,y2,x3,y3,x4,y4。(-10^8 <= xi, yi <= 10^8)
(直线1的两个端点为x1,y1 | x2, y2,直线2的两个端点为x3,y3 | x4, y4)

输出

输出共T行,如果相交输出"Yes",否则输出"No"。

输入样例

2
1 2 2 1 0 0 2 2
-1 1 1 1 0 0 1 -1

输出样例

Yes
No

注意判断还是可以的,
记得不要变量名为y1
跟c++ 里面的变量名重复了.
所以会报错.
 1 #include <bits/stdc++.h>
 2 #define ll long long int
 3 using namespace std;
 4 
 5 double get_k(double x1, double yy, double x2, double y2){
 6     return (yy-y2)/(x1-x2);
 7 }
 8 
 9 int t;
10 double x1, yy, x2, y2, x3, y3, x4, y4;
11 int main(){
12     cin>>t;
13     while(t--){
14         cin>>x1>>yy>>x2>>y2>>x3>>y3>>x4>>y4;
15         double k1 = get_k(x1, yy, x2, y2);
16         double d1 = yy - k1 * x1;
17 
18         double k2 = get_k(x3, y3, x4, y4);
19         double d2 = y3 - k2 * x3;
20 
21         if(k1 == k2){
22             if(d1 == d2 && (y3 == (k1*x3 + d1) || y4 == (k1*x4 + d1) || yy == (k2*x1 + d2) || y2 == (k2*x2 + d2))){
23                 cout<<"Yes"<<endl;
24             }else{
25                 cout<<"No"<<endl;
26             }
27         }else{
28             double xx = (d2 - d1)/(k1 - k2);
29             if(xx >= min(x1, x2) && xx <= max(x1, x2) && xx >= min(x3, x4) && xx <= max(x3, x4) ){
30                 cout<<"Yes"<<endl;
31             }else{
32                 cout<<"No"<<endl;
33             }
34         }
35     }
36     return 0;
37 }
原文地址:https://www.cnblogs.com/zllwxm123/p/9904499.html