問題 C 線段交

2021-09-23 08:15:17 字數 1554 閱讀 2038

題目

題目描述

給定n個線段。求有交點的線段對數。

保證沒有兩條線段共線

輸入一行乙個整數n,表示線段的個數

第2~n+1行,每行四個實數,x1,y1,x2,y2,表示線段的兩個端點(x1,y1)和(x2,y2)

輸出一行乙個整數,表示有交點的線段對數。

樣例輸入

複製樣例資料 3

0.00 0.00 1.00 1.00

0.00 1.00 1.00 0.00

0.00 0.00 1.00 0.00

樣例輸出3提示

(0,0)(1,1)和(0,1)(1,0)有交點

(0,0)(1,1)和(0,0)(1,0)有交點

(0,1)(1,0)和(0,0)(1,0)有交點

對於100%的資料,n≤100

點的座標範圍(−10000,10000)

題解: 本題主要是要注意直斜率不存在的情況,重合點和精度問題,前者特判,後者通過set和通過座標放大的方法來解決精度問題

#include

#include

#include

using namespace std;

struct node

p[105];

struct node

}n;sets;

///交點集合

intmain()

else

//cout<<"i="<}

for(

int i=

0;i)else

///判斷交點是否在兩個線段上,交點到兩個點的距離都小於線段長度

double newx11=n.x-p[i]

.x1,newy11=n.y-p[i]

.y1;

double d11=

sqrt

(newx11*newx11+newy11*newy11)

;double newx12=n.x-p[i]

.x2,newy12=n.y-p[i]

.y2;

double d12=

sqrt

(newx12*newx12+newy12*newy12)

;double newx21=n.x-p[j]

.x1,newy21=n.y-p[j]

.y1;

double d21=

sqrt

(newx21*newx21+newy21*newy21)

;double newx22=n.x-p[j]

.x2,newy22=n.y-p[j]

.y2;

double d22=

sqrt

(newx22*newx22+newy22*newy22);if

(d11<=p[i]

.d&&d21<=p[j]

.d&&d12<=p[i]

.d&&d22<=p[j]

.d)//cout<}

} cout

<}

ZOJ 問題 C 線段交

題目描述 給定n個線段。求有交點的線段對數。保證沒有兩條線段共線 輸入一行乙個整數n,表示線段的個數 第2 n 1行,每行四個實數,x1,y1,x2,y2,表示線段的兩個端點 x1,y1 和 x2,y2 輸出一行乙個整數,表示有交點的線段對數。複製樣例資料 3 0.00 0.00 1.00 1.00...

線段樹 面積交

給定平面上若干矩形,求出被這些矩形覆蓋過至少兩次的區域的面積.input輸入資料的第一行是乙個正整數t 1 t 100 代表測試資料的數量.每個測試資料的第一行是乙個正整數n 1 n 1000 代表矩形的數量,然後是n行資料,每一行包含四個浮點數,代表平面上的乙個矩形的左上角座標和右下角座標,矩形的...

計算幾何札記 線段交

叉積求面積和直線交點座標模板 int n struct point point a max b max c max d max p max max double area max max ans point getpoint point p1,point p2,point p3,point p4 已...