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
が一致するかで分かります。