AtCoderのARC
次のARCの問題へ
前のARCの問題へ
ARC051-A 塗り絵
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("-1 -1 2");
WillReturn.Add("2 3 4 5");
//YES
//YES
}
else if (InputPattern == "Input2") {
WillReturn.Add("0 1 1");
WillReturn.Add("-2 0 4 3");
//NO
//YES
}
else if (InputPattern == "Input3") {
WillReturn.Add("0 0 5");
WillReturn.Add("-2 -2 2 1");
//YES
//NO
}
else if (InputPattern == "Input4") {
WillReturn.Add("0 0 2");
WillReturn.Add("0 0 4 4");
//YES
//YES
}
else if (InputPattern == "Input5") {
WillReturn.Add("0 0 5");
WillReturn.Add("-4 -4 4 4");
//YES
//YES
}
else {
string wkStr;
while ((wkStr = Console.ReadLine()) != null) WillReturn.Add(wkStr);
}
return WillReturn;
}
static void Main()
{
List<string> InputList = GetInputList();
decimal[] wkArr = { };
Action<string> SplitAct = pStr =>
wkArr = pStr.Split(' ').Select(pX => decimal.Parse(pX)).ToArray();
SplitAct(InputList[0]);
decimal X1 = wkArr[0];
decimal Y1 = wkArr[1];
decimal R = wkArr[2];
SplitAct(InputList[1]);
decimal X2 = wkArr[0];
decimal Y2 = wkArr[1];
decimal X3 = wkArr[2];
decimal Y3 = wkArr[3];
// 円が長方形に内包するかの判定
bool IsNaihou1 = false;
if (X2 <= X1 - R && X1 + R <= X3
&& Y2 <= Y1 - R && Y1 + R <= Y3) {
IsNaihou1 = true;
}
// 長方形が円に内包するかの判定
var NormList = new List<decimal>();
NormList.Add(DeriveNorm(X2 - X1, Y2 - Y1));
NormList.Add(DeriveNorm(X2 - X1, Y3 - Y1));
NormList.Add(DeriveNorm(X3 - X1, Y2 - Y1));
NormList.Add(DeriveNorm(X3 - X1, Y3 - Y1));
bool IsNaihou2 = NormList.TrueForAll(pX => pX <= R * R);
if (IsNaihou1 == false && IsNaihou2 == false) {
Console.WriteLine("YES");
Console.WriteLine("YES");
}
if (IsNaihou1 && IsNaihou2 == false) { // 長方形のみ存在
Console.WriteLine("NO");
Console.WriteLine("YES");
}
if (IsNaihou1 == false && IsNaihou2) { // 円のみ存在
Console.WriteLine("YES");
Console.WriteLine("NO");
}
}
static decimal DeriveNorm(decimal pXDiff, decimal pYDiff)
{
return pXDiff * pXDiff + pYDiff * pYDiff;
}
}
解説
円が長方形に内包する必要条件は、
円の中心が長方形の内部に存在することで、
もう少し考察すると
円の中心からの半径分の円が長方形の内部にあることが
必要十分条件だと分かります。
長方形が円に内包する必要十分条件は、
円の中心から、長方形の4つの頂点までの距離が、
全て半径以下であることになります。