AtCoderのABC    次のABCの問題へ    前のABCの問題へ

ABC224-C Triangle?


問題へのリンク


C#のソース

using System;
using System.Collections.Generic;
using System.Linq;

class Program
{
    static string InputPattern = "InputX";

    static List<string> GetInputList()
    {
        var WillReturn = new List<string>();

        if (InputPattern == "Input1") {
            WillReturn.Add("4");
            WillReturn.Add("0 1");
            WillReturn.Add("1 3");
            WillReturn.Add("1 1");
            WillReturn.Add("-1 -1");
            //3
        }
        else if (InputPattern == "Input2") {
            WillReturn.Add("20");
            WillReturn.Add("224 433");
            WillReturn.Add("987654321 987654321");
            WillReturn.Add("2 0");
            WillReturn.Add("6 4");
            WillReturn.Add("314159265 358979323");
            WillReturn.Add("0 0");
            WillReturn.Add("-123456789 123456789");
            WillReturn.Add("-1000000000 1000000000");
            WillReturn.Add("124 233");
            WillReturn.Add("9 -6");
            WillReturn.Add("-4 0");
            WillReturn.Add("9 5");
            WillReturn.Add("-7 3");
            WillReturn.Add("333333333 -333333333");
            WillReturn.Add("-9 -1");
            WillReturn.Add("7 -10");
            WillReturn.Add("-1 5");
            WillReturn.Add("324 633");
            WillReturn.Add("1000000000 -1000000000");
            WillReturn.Add("20 0");
            //1124
        }
        else {
            string wkStr;
            while ((wkStr = Console.ReadLine()) != null) WillReturn.Add(wkStr);
        }
        return WillReturn;
    }

    struct PointDef
    {
        internal long X;
        internal long Y;
    }

    static void Main()
    {
        List<string> InputList = GetInputList();

        long[] wkArr = { };
        Action<string> SplitAct = pStr =>
            wkArr = pStr.Split(' ').Select(pX => long.Parse(pX)).ToArray();

        var PointList = new List<PointDef>();
        foreach (string EachStr in InputList.Skip(1)) {
            SplitAct(EachStr);
            PointDef WillAdd;
            WillAdd.X = wkArr[0];
            WillAdd.Y = wkArr[1];
            PointList.Add(WillAdd);
        }

        long Answer = 0;
        for (int I = 0; I <= PointList.Count - 1; I++) {
            for (int J = I + 1; J <= PointList.Count - 1; J++) {
                for (int K = J + 1; K <= PointList.Count - 1; K++) {
                    PointDef Vect1 = SetVector(PointList[I], PointList[J]);
                    PointDef Vect2 = SetVector(PointList[I], PointList[K]);

                    if (Vect1.X * Vect2.Y == Vect1.Y * Vect2.X) {
                    }
                    else {
                        Answer++;
                    }
                }
            }
        }
        Console.WriteLine(Answer);
    }

    // 始点と終点の座標を引数として、始点から終点へのベクトルを返す
    static PointDef SetVector(PointDef pStaPoint, PointDef pEndPoint)
    {
        PointDef WillReturn;
        WillReturn.X = pEndPoint.X - pStaPoint.X;
        WillReturn.Y = pEndPoint.Y - pStaPoint.Y;
        return WillReturn;
    }
}


解説

3点の組み合わせごとに
1点を始点から、残りの2点を終点とするベクトルを2つ用意し、
Xの増加量 : Yの増加量の比が一致したら、
3点は一直線上にあります。

比の一致は、
A : B = C : D
として、内項と外項の積
A*D = B*C
が一致するかで分かります。