トップページに戻る
   次の競技プログラミングの問題へ
   前の競技プログラミングの問題へ
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型を避けることにこだわってみました。