数HDU 1086あなたが直線の交点Nを見つけ、あまりにも幾何学の問題を解決することができます

あなたもジオメトリの問題を解決することができます

制限時間:1000分の2000 MS(Javaの/その他)メモリの制限:32768分の65536 K(Javaの/その他)
の合計提出(S):13549受理提出(S):6645


問題の説明
多くのジオメトリー(几何)の問題は、ACM / ICPCに設計されていました。そして今、私はまた、この最終試験のための幾何学の問題を準備します。多くのACMersの経験によると、幾何学的な問題は、常に多くの問題ですが、この問題は、私たちが今、試験に参加しているすべてのではなく、コンテストが:)の後に、非常に簡単です
、あなたにNを与える(1 <= N <= 100)のセグメント(线段)、全ての交点の数(交点)出力をしてください。M(M> 2)セグメントが同じ点で交わる場合は繰り返しカウントする必要があります。

注意:
次の2つのセグメントが複数の箇所で交差しないことを前提とすることができます。
 

 

入力
入力は複数のテストケースが含まれています。各テストケースは、最初の行に整数Nを(1 = N <= 100)が含まれ、そして次にNラインが従います。各行は4台のフロートと一つのセグメントは、セグメントの終点の座標であるX1、Y1、X2、Y2値について説明します。
0から始まるテストケースは、入力を終了し、このテストケースは、処理されるべきではありません。
 

 

出力
各場合について、交差点の数、1つのライン一つのケースを印刷します。
 

 

サンプル入力
2
0.00 0.00 1.00 1.00
0.00 1.00 1.00 0.00
3
0.00 0.00 1.00 1.00
0.00 1.00 1.00 0.000
0.00 0.00 1.00 0.00
0
 

 

サンプル出力
1
3
 
著者
LCY
 
問題の意味:交差点の直線のn個の数を決定します
 
#include <iostreamの> 
する#include < 文字列・H> 
の#include < ストリング > 
の#include <アルゴリズム> 
の#include <math.h>の
書式#include < ストリング > 
の#include < 文字列・H> 
の#include <ベクトル> 
する#include <ユーティリティ> 
書式#include <>マッピング
する#include <キュー> 
の#include < 設定 >
 の#define MX 0x3f3f3f3f
 の#define LL長い長い
 使って 名前空間はstdを、
const  int型 N =100010 ;
 INT フラグに、
 ダブルANS1、ANS2、YY、
 構造体ポイント// 定義ポイント構造
{
     ダブルX、Y; 
}; 
構造体 stline // 側の構造の定義
{ 
    点A、B; 
}行[ 105 ]。

BOOL CMP(点A、点B)
{ 
    リターン AY < によって; 
} 
int型 dblcmp(ダブル A、ダブルB)
{ 
    IF(FABS(A - B)<= 1E- 6。 戻り 0 ;
     IF(A> B)リターン 1。;
     他の 復帰 - 1 ; 
} 
// *************** ***************線分点決意内積かに
ダブルピリオド(ダブル X1、ダブル Y1、ダブル X2、ダブル Y2)// ドット積
{
     戻り X1の*のY1 +×2 *のY2; 
} 

int型 point_on_line(点A、点B、点C)// ポイントを見つける線分ではありませんBCに、> 0は、エンドポイント= 0、<0と一致する、ではありません。
{
     戻り dblcmp(DOT(BX - AX、によって- AY、CX - AX、CY - AY)、0 ); 
} 
//************************************************** 
ダブルクロス(ダブル X1、ダブル Y1、ダブル X2、ダブルY2)
{ 
    戻り X1の*のY2 - X2の*のY1; 
} 
ダブル ab_cross_ac(点A、点B、点C)// ABおよびACおよび外積
{
     戻りクロス( BX - AY、CX - - AX、CY -によってAX、AY); 
} 
int型 ab_cross_cd(点A、点B、点C、点D)// ABとCDが交差するかどうかを見つける、交点Pです。仕様1は、ゼロ交差が線分、-1互いに素の終点で交差します。
{
     ダブルS1、S2、S3、S4;
     int型の 
    D1 D1、D2、D3、D4。
    点P; = dblcmp(S1 = ab_cross_ac(A、B、C)、0 ); 
    D2 = dblcmp(S2 = ab_cross_ac(A、B、D)、0 ); 
    D3 = dblcmp(S3 = ab_cross_ac(C、D、 A)、0 ); 
    D4 = dblcmp(ab_cross_ac S4 =(C、D、B)、0 ); 

// 要求が交差仕様を交差する場合
    IF((D1 D2 ^)== - 2 &&(D4 D3 ^)= = - 2 
    { 
        PX =(CX-DX * S1 * S2)/(S2- S1)
        のPy =(CY-のDy * S1 * S2)/(S2- S1);
         リターン 1 ; 
    } 

// そうでない場合、標準的な交差点
    IF(D1の== 0&& point_on_line(C、B)<= 0 
    { 
        P = C。
        リターン 0 ; 
    } 
    であれば(D2の== 0 && point_on_line(D、B)<= 0 
    { 
        P = D。
        リターン 0 ; 
    } 
    場合(D3の== 0 && point_on_line(C、D)<= 0 
    { 
        P = リターン 0 ; 
    } 
    であれば(D4 == 0 && point_on_line(B、C、D)<= 0 
    { 
        P = B。
        リターン 0 ; 
    } 
// 如果不相交
    リターン - 1 
} 
int型のmain()
{ 
    int型のT。
    一方、(scanf関数(" %のD "、&​​T)&& T)
    { 
        int型の CNT = 0 以下のためにint型 I = 1 ; I <= T iは++ 
            のscanf(" %LF%LF%LF%LF "、およびライン[I] .A、&ライン[I] .ay、&ライン[I] .bx、&ライン[I] .by)。
        にとってint型 I = 1、I <= T; iが++ 
        { 
            ためのint型 J = I + 1、J <= T; J ++ 
            { 
                場合(ab_cross_cd(ライン[I] .A、ライン[I] .B、ライン[J !] .A、ライン[J] .B)= - 1 
                    CNT ++ ; 
            } 
        } 
        のprintf(" %d個の\ n " 、CNT)。
    } 
    戻り 0 
}

 

 

おすすめ

転載: www.cnblogs.com/-citywall123/p/11496260.html