トップページに戻る
次の競技プログラミングの問題へ
前の競技プログラミングの問題へ
No.98 円を描こう
■■■問題■■■
A君は円を描こうとしています。
ここで円を描く際の条件があります。
・描く円の中心はXY平面上の原点にあります。
・描く円の直径はかならず整数でなければなりません。
・指定された整数座標の点P(Xp,Yp)がかならず円の内側にあること。
内側とは円の線とは重ならない内側のことです。
描ける円の最小の直径を求めよ。
(ヒント:三平方の定理を使用します)
■■■入力■■■
Xp Yp
点Pの座標(Xp,Yp)のXpとYpが与えられる。
Xp,Ypはともに整数。(-10000 <= Xp,Yp <= 10000)
■■■出力■■■
描ける円の最小の直径を1行で答えよ。
最後に改行を忘れずに。
C#のソース
using System;
using System.Collections.Generic;
using System.Linq;
class Program
{
static string InputPattern = "Input1";
static List<string> GetInputList()
{
var WillReturn = new List<string>();
if (InputPattern == "Input1") {
WillReturn.Add("3 0");
//7
//直径6の円を描くと点Pと重なります。
//よって直径7の円を描けば点Pを円の内側にすることができます。
}
else if (InputPattern == "Input2") {
WillReturn.Add("-3 4");
//11
//直径10の円を描くと点Pと重なります。
//よって直径11の円を描けば点Pを円の内側にすることができます。
}
else if (InputPattern == "Input3") {
WillReturn.Add("4 4");
//12
//点P(4,4)は直径12の円を描けば内側にすることができます
}
else if (InputPattern == "Input4") {
WillReturn.Add("0 0");
//1
//点Pは原点なので直径1の円を描けば内側にすることができます
}
else {
string wkStr;
while ((wkStr = Console.ReadLine()) != null) WillReturn.Add(wkStr);
}
return WillReturn;
}
static void Main()
{
List<string> InputList = GetInputList();
int[] wkArr = InputList[0].Split(' ').Select(X => int.Parse(X)).ToArray();
//点に接する円の直径の2乗
int Tyokkei2Jyou = wkArr[0] * 2 * wkArr[0] * 2 + wkArr[1] * 2 * wkArr[1] * 2;
for (int I = 1; ; I++) {
if (I * I > Tyokkei2Jyou) {
Console.WriteLine(I);
return;
}
}
}
}
解説
Double型を避けることにこだわってみました。