日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

计算几何 - XOJ 1171 线段求交

發布時間:2023/12/19 编程问答 32 豆豆
生活随笔 收集整理的這篇文章主要介紹了 计算几何 - XOJ 1171 线段求交 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

問題

Description 線段求交即給定一組線段求出這些線段的相交情況,它是計算幾何的基礎問題之一,有著廣泛的應用. Input第一行為一個正整數n表示線段的個數(n<=10000)第二行到第n+1行每行包括4個正整數x1,y1,x2,y2, (0 <= x1,y1,x2,y2 <= 1000) x1,x2表示線段兩端點的橫坐標,y1,y2表示線段兩端點的縱坐標注意線段的兩端點可能重合 即(x1,y1)有可能等于(x2,y2) Output一個正整數k, 表示相交的線段對數,這里只要兩線段有接觸即為相交.數據保證k<=100000. Sample Input 8 10 13 20 56 37 60 40 7 87 57 113 5 96 16 125 51 171 4 231 4 200 4 211 43 268 36 354 36 283 4 314 36 Sample Output 3

TLE代碼

#include<stdio.h> #define N 10002/** 算法適用于整形點,不適用于浮點型 **/typedef struct Point {int x;int y; }Point;double min(int x, int y) {return x<y?x:y; }double max(int x, int y) {return x>y?x:y; }//排斥實驗 bool IsRectCross(const Point &p1,const Point &p2,const Point &q1,const Point &q2) {bool ret = min(p1.x,p2.x) <= max(q1.x,q2.x) &&min(q1.x,q2.x) <= max(p1.x,p2.x) &&min(p1.y,p2.y) <= max(q1.y,q2.y) &&min(q1.y,q2.y) <= max(p1.y,p2.y);return ret; } //跨立判斷 bool IsLineSegmentCross(const Point &P1,const Point &P2,const Point &Q1,const Point &Q2) {if(((Q1.x-P1.x)*(Q1.y-Q2.y)-(Q1.y-P1.y)*( Q1.x-Q2.x)) * ((Q1.x-P2.x)*(Q1.y-Q2.y)-(Q1.y-P2.y)*(Q1.x-Q2.x)) < 0 ||((P1.x-Q1.x)*(P1.y-P2.y)-(P1.y-Q1.y)*(P1.x-P2.x)) * ((P1.x-Q2.x)*(P1.y-P2.y)-(P1.y-Q2.y)*( P1.x-P2.x)) < 0) return true;elsereturn false; }int main() //O(n^2) {int n,i,j;Point arr[N][2];int count; while(scanf("%d",&n)!=EOF && n!=0)//第一行為一個正整數n表示線段的個數(n<=10000){count=0;for(i=1;i<=n;i++)scanf("%d %d %d %d", &arr[i][0].x, &arr[i][0].y, &arr[i][1].x,&arr[i][1].y); //第二行到第n+1行每行包括4個正整數x1,y1,x2,y2, (0 <= x1,y1,x2,y2 <= 1000) for(i=1; i<=n; i++)for(j=i+1; j<=n; j++)if(IsRectCross(arr[i][0],arr[i][1],arr[j][0],arr[j][1])&&IsLineSegmentCross(arr[i][0],arr[i][1],arr[j][0],arr[j][1]))count++;printf("%d\n",count);}return 0; }/** 8 10 13 20 56 37 60 40 7 87 57 113 5 96 16 125 51 171 4 231 4 200 4 211 43 268 36 354 36 283 4 314 36 **//**************************************************************Problem: 1171User: cld378632668Language: C++Result: Time Limit Exceed ****************************************************************/

AC 代碼

#include <stdio.h> #include <string.h> #define p(x1,y1,x2,y2,a,b) ((y2-y1)*(a-x1)+(y1-b)*(x2-x1)) #define max(a,b) ((a)>(b)?(a):(b)) #define min(a,b) ((a)<(b)?(a):(b)) int main() {#ifndef ONLINE_JUDGEfreopen("1.in","r",stdin); // freopen("1.out","w",stdout);#endif // ONLINE_JUDGEint n,m;scanf("%d",&n);int x1[n+1],y1[n+1],x2[n+1],y2[n+1],i,j,a,b,c,d,sum=0;for (i=1;i<=n;i++)scanf("%d%d%d%d",x1+i,y1+i,x2+i,y2+i);for (i=1;i<n;i++)for (j=i+1;j<=n;j++){a=p(x1[j],y1[j],x2[j],y2[j],x1[i],y1[i]);b=p(x1[j],y1[j],x2[j],y2[j],x2[i],y2[i]);c=p(x1[i],y1[i],x2[i],y2[i],x1[j],y1[j]);d=p(x1[i],y1[i],x2[i],y2[i],x2[j],y2[j]);if (!a && !b && !c && !d){if (max(x1[i],x2[i])>=min(x1[j],x2[j]) && max(x1[j],x2[j])>=min(x1[i],x2[i]) && max(y1[i],y2[i])>=min(y1[j],y2[j]) && max(y1[j],y2[j])>=min(y1[i],y2[i]))sum++;}else{if ((a<=0 && b>=0 || a>=0 && b<=0) && (c<=0 && d>=0 || c>=0 && d<=0)){sum++;//printf("%d %d\n",i,j);}}}printf("%d\n",sum);return 0; }

總結

以上是生活随笔為你收集整理的计算几何 - XOJ 1171 线段求交的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。