// hdu1086するセグメントの交点数nを見つけます。。。
// http://acm.hdu.edu.cn/showproblem.php?pid=1086
//以下は翻訳された先端であります:
// もしN(1 <= N <= 100) のセグメント(セグメント)、出力すべての交点の数。M(Mは> 2)の線分が同じ点で交差する場合、計算が繰り返されるべきです。
//次の2つのセグメントが複数の交差しないと仮定することができます。(重複しません)
//非常に一般的なソリューション:各2つの線分を介しが交差するかどうかを決定します。
2つの連立:// 2行がアプローチを交差するかどうかを判断します。交点座標を求めます。。。
//高校の知識、直接導出することができ、覚えていません。
//線形方程式の一般式:(Y2 - Y1)* X +(X1 - X2)*のY +(×2 *のY1 - ×1 *のY2)= 0;元の式(A * X +のB * Y + C = 0)
/(A1の* B2の - A2 * B1)、Y - (B2 * C1 B1 * C2)://交差点は、x座標(A2の* C1の - A1 * C2)/(A1の* B2の - A2 * B1)を、
//のA1 * B2の場合 - A2 * B1 == 0は交差点が存在しないことを示している(平行)
1の#include <cstdioを> 2 3 構造体のライン{ 4 ダブルX1、Y1、X2、Y2。 5 }行[ 105 ]。 6 7 INT N。 8 9は、 BOOL(交差INT L1、INT {L2) 10 の二重 - [L1] .y2 A1 =行; .y1ライン[L1] 11 二重 B1 =行[L1] .x1 - ライン[L1] .x2。 12 二重 C1 =行[L1] .x2の*ライン[L1] .y1 -ライン[L1] .x1 * ライン[L1] .y2。 13 二重 A2 =行[L2] .y2 - ライン[L2] .y1。 14 二重 B2 =行[L2] .x1 - ライン[L2] .x2。 15 二重 C2 =行[L2] .x2の*ライン[L2] .y1 -ライン[L2] .x1 * ライン[L2] .y2。 16 もし(A1の* b2を- A2 * B1 == 0)を返す 偽。 17 二重 X =(B1の* C2の- B2 * C1)/(A1の* B2の- A2 * B1)。 18 二重 Y =(A2の* C1の- A1 * C2)/(A1の* B2の- A2 * B1)。 19 であれば((X> =ライン[L1] .x1 && X <=行[L1] .x2 || X <=行[L1] .x1 && X> = ライン[L1] .x2) 20 &&(X> =行[L2] .x1 && X <=行[L2] .x2 || X <=行[L2] .x1 && X> =ライン[L2]。 21 リターン はfalse ; 22 } 23 24 INT メイン(){ 25 ながら(scanf関数(" %のD "、&N)== 1 && N){ 26 のための(int型 I = 0を!; I = N; ++ i)が{ 27 のscanf(" %LF%LF%LF%LF 」、およびライン[I] .x1、&ライン[I] .y1、&ライン[I] .x2、&ライン[I] .y2)。 28 } 29 INT ANS = 0 。 30 のための(int型 I =0 ; I = N!1。++ I){ 31 のための(int型 J = I + 1 ;!; J = N ++ J){ 32 場合)++ ANS(交差(I、J) 。 33 } 34 } 35 のprintf(" %d個の\ n " 、ANS)。 36 } 37 リターン 0 。 38 }