[Atelier Blue アトリエブルー]Homeコンテストパソコン甲子園2003年本選>25問目

25問目(平行判定)

問題

A=(x1,y1),B=(x2,y2),C=(x3,y3),D=(x4,y4)の異なる4つの座標点が与えられたとき、直線ABと直線CDが平行かどうかを判定、平行である場合にはYES、そうでない場合にはNOを出力するプログラムを作成。

なお、x1,y1,x2,y2,x3,y3,x4,y4はそれぞれ-100以上100以下です。

入力


x1(実数)
y1(実数)
x2(実数)
y2(実数)
x3(実数)
y3(実数)
x4(実数)
y4(実数)

出力

YES または NO

入力例


0
0
1
1
0
1
1
2

出力例

YES

解き方例

まず、点Bから点Aを、点Dから点Cを引き算します。そうすると、原点(0,0)からB,Dそれぞれを通る直線に平行移動できます。後は、この二つの傾きを比較すればそれが平行であるのか分かります。

この際0除算に注意してください。

ソースコード

お持ち帰り

C/C++

#include <stdio.h>

int main(){
    double x1,y1,x2,y2,x3,y3,x4,y4;

    scanf("%lf %lf %lf %lf %lf %lf %lf %lf",&x1,&y1,&x2,&y2,&x3,&y3,&x4,&y4);

    x2 -= x1;
    y2 -= y1;
    x4 -= x3;
    y4 -= y3;

    if(x2 == 0 || x4 == 0){
        if(x2 == 0 && x4 == 0){
            printf("YES\n");
        }else{
            printf("NO\n");
        }
    }else{
        if(y2/x2 == y4/x4){
            printf("YES\n");
        }else{
            printf("NO\n");
        }
    }

    return 0;
}

その他

最初は、それぞれの直線の傾きをバカ正直に求めていましたが少し改良すると簡単に出来る事に気付いて修正しました(平行移動しても傾きが変わらないことに気付かなかった)。原点に合わせるという動作は他の図形問題でも簡単に求めるために役に立ちます。ちょっとした前処理でif文の中身を簡単に出来るのであればバグも減らせることでしょう。


ページの一番上へ
前のページへ 一覧に戻る 次のページへ
初版2006-5-28
[Atelier Blue アトリエブルー]Homeコンテストパソコン甲子園2003年本選>25問目