Problem:
MathJax.Hub.Config({ tex2jax: { inlineMath: [["$","$"], ["\\(","\\)"]], processEscapes: true }});

直交判定

平面上の異なる 4 点、$A (x_A, y_A)$, $B (x_B, y_B)$, $C (x_C, y_C)$, $D (x_D, y_D)$ の座標を読み込んで、直線 $AB$ と $CD$ が直交する場合には YES、直交しない場合には NO と出力するプログラムを作成してください。ここで、「直線」とは線分のことではありません。以下の図を参考にして下さい。

Input

複数のデータセットが与えられます。各データセットの形式は以下のとおりです。

$x_A$ $y_A$ $x_B$ $y_B$ $x_C$ $y_C$ $x_D$ $y_D$

$x_A$, $y_A$, $x_B$, $y_B$, $x_C$, $y_C$, $x_D$, $y_D$ はそれぞれ -100 以上 100 以下であり、各値は小数点以下最大 5 桁までの数字を含む実数で与えられます。

データセットの数は 100 を超えません。

Output

各データセットに対して、YES または NO を１行に出力して下さい。

Sample Input

1.0 1.0 2.0 2.0 0.0 0.0 1.0 -1.0
0.0 0.0 2.0 0.0 -1.0 2.0 2.0 2.0
10.0 6.0 3.4 5.2 6.8 9.5 4.3 2.1
2.5 3.5 2.5 4.5 -3.3 -2.3 6.8 -2.3

Output for the Sample Input

YES
NO
NO
YES

Solution in C# (judge verdict: Wrong Answer)

using System;

namespace AOJ0058
{
    class Program
    {
        static void Main(string[] args)
        {
            while (true)
            {
                string input = Console.ReadLine();
                if (string.IsNullOrEmpty(input)) break;

                string[] num = input.Split(' ');
                Point a = new Point(num[0], num[1]);
                Point b = new Point(num[2], num[3]);
                Point c = new Point(num[4], num[5]);
                Point d = new Point(num[6], num[7]);
                Line p = new Line(a, b);
                Line q = new Line(c, d);
                
                if (check_ortho(p, q))
                {
                    Console.WriteLine("YES");
                } else
                {
                    Console.WriteLine("NO");
                }
            }
        }

        static bool check_ortho (Line p, Line q)
        {
            if (p.axis ^ q.axis)
            {
                if (p.slope == 0 && q.slope == 0)
                {
                    return true;
                } else
                {
                    return false;
                }
            } else
            {
                decimal tmp = p.slope * q.slope;
                if (tmp.Equals(decimal.MinusOne))
                {
                    return true;
                } else
                {
                    return false;
                }
            }
        }
    }

    public struct Point
    {
        public decimal X, Y;

        public Point(string a, string b)
        {
            this.X = decimal.Parse(a);
            this.Y = decimal.Parse(b);
        }
    }

    public struct Line
    {
        public decimal slope;
        public bool axis;

        public Line(Point a, Point b)
        {
            if (b.X.Equals(a.X))
            {
                this.slope = 0;
                axis = true;
            } else
            {
                this.slope = (b.Y - a.Y) / (b.X - a.X);
                axis = false;
            }   
        }
    }
}