トップページに戻る    次の競技プログラミングの問題へ    前の競技プログラミングの問題へ

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型を避けることにこだわってみました。