題目
題目描述
給定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 已...