1. 程式人生 > >1264 線段相交

1264 線段相交

否則 clas ref times close efi spl main tor

1264 線段相交

基準時間限制:1 秒 空間限制:131072 KB 分值: 0 難度:基礎題

給出平面上兩條線段的兩個端點,判斷這兩條線段是否相交(有一個公共點或有部分重合認為相交)。 如果相交,輸出"Yes",否則輸出"No"。

Input

第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)

Output

輸出共T行,如果相交輸出"Yes",否則輸出"No"。

Input示例

2

1 2 2 1 0 0 2 2

-1 1 1 1 0 0 1 -1

Output示例

Yes

No

//線段相交模板題,學習了判斷線段相交後,竟然debug一下午,因為我用的 long long ,

算完叉積後,相乘超過數據範圍了,會出現錯誤,但如果使用的是double,超數據範圍也不會改變符號,所以答案依舊是對的。。。

幾何問題,這篇博客不錯,幾何

double:

技術分享
 1 #include <bits/stdc++.h>
 2 using namespace
std; 3 #define LL long long 4 #define eps 1e-8 5 #define MOD 1000000007 6 #define MX 1005 7 /* 8 判斷P1P2跨立Q1Q2的依據是: 9 ( P1 - Q1 ) × ( Q2 - Q1 ) * ( Q2 - Q1 ) × ( P2 - Q1 ) ≥ 0 10 判斷Q1Q2跨立P1P2的依據是: 11 ( Q1 - P1 ) × ( P2 - P1 ) * ( P2 - P1 ) × ( Q2 - P1 ) ≥ 0 12 */ 13 struct
Point 14 { 15 double x,y; 16 Point(){} 17 Point(double _x,double _y){x=_x;y=_y;} 18 Point operator - (Point b)const{ 19 return Point(x-b.x,y-b.y); 20 } 21 double operator ^ (Point b)const{ 22 return x*b.y-b.x*y; 23 } 24 }pt[5]; 25 26 LL cha(int p1,int p2,int q1,int q2) 27 { 28 Point sa, sb, sc; 29 sa = pt[p1]-pt[q1]; 30 sb = pt[q2]-pt[q1]; 31 sc = pt[p2]-pt[q1]; 32 if ((sa^sb)*(sb^sc)<0) return 0; 33 return 1; 34 } 35 36 int main() 37 { 38 int T; 39 scanf("%d",&T); 40 while (T--) 41 { 42 for (int i=1;i<=4;i++) 43 scanf("%lf%lf",&pt[i].x,&pt[i].y); 44 if (cha(1,2,3,4)&&cha(3,4,1,2)) 45 printf("Yes\n"); 46 else 47 printf("No\n"); 48 } 49 return 0; 50 }
View Code

long long:

技術分享
 1 #include <bits/stdc++.h>
 2 using namespace std;
 3 #define LL long long
 4 #define MOD 1000000007
 5 #define MX 1005
 6 struct Point
 7 {
 8     LL x,y;
 9     Point(){}
10     Point(LL _x,LL _y){x=_x;y=_y;}
11     Point operator - (Point b)const{
12         return Point(x-b.x,y-b.y);
13     }
14     LL operator ^ (Point b)const{
15         return x*b.y-b.x*y;
16     }
17 }pt[5];
18 
19 LL cha(int p1,int p2,int q1,int q2)
20 {
21     Point sa, sb, sc;
22     sa = pt[p1]-pt[q1];
23     sb = pt[q2]-pt[q1];
24     sc = pt[p2]-pt[q1];
25     LL c1 = sa^sb;
26     LL c2 = sb^sc;
27     if (c1>0&&c2>0) return 1;
28     if (c1<0&&c2<0) return 1;
29     if (c1==0||c2==0) return 1;
30     return 0;
31 }
32 
33 int main()
34 {
35     int T;
36     scanf("%d",&T);
37     while (T--)
38     {
39         for (int i=1;i<=4;i++)
40             scanf("%lld%lld",&pt[i].x,&pt[i].y);
41         if (cha(1,2,3,4)&&cha(3,4,1,2))
42             printf("Yes\n");
43         else
44             printf("No\n");
45     }
46     return 0;
47 }
View Code

1264 線段相交