1264 線段相交
阿新 • • 發佈:2017-09-23
否則 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 namespaceView Codestd; 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 structPoint 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 }
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 線段相交