diff --git a/rsuzuki/README.md b/rsuzuki/README.md new file mode 100644 index 0000000000000000000000000000000000000000..796c95d353f961f632c60d81ef2bdf62fa8ea5ff --- /dev/null +++ b/rsuzuki/README.md @@ -0,0 +1,2 @@ +# Paiza +knoda用 diff --git a/rsuzuki/src/C021_storm.java b/rsuzuki/src/C021_storm.java new file mode 100644 index 0000000000000000000000000000000000000000..5f03f8ddd6f7ee954330608732ec2f3d3ca7f300 --- /dev/null +++ b/rsuzuki/src/C021_storm.java @@ -0,0 +1,92 @@ +package paiza_c; + +import java.util.Scanner; + +/** + * 台風の情報を保持し、暴風域判定ロジックを提供するクラス + */ +class Typhoon { + /** 台風の中心X座標 */ + private final int centerX; + /** 台風の中心Y座標 */ + private final int centerY; + /** 内円の半径の2乗 */ + private final int inRadiusSq; + /** 外円の半径の2乗 */ + private final int outRadiusSq; + + /** + * @param centerX 台風の中心X座標 + * @param centerY 台風の中心Y座標 + * @param inRadius 内円の半径 + * @param outRadius 外円の半径 + */ + public Typhoon(int centerX, int centerY, int inRadius, int outRadius) { + this.centerX = centerX; + this.centerY = centerY; + this.inRadiusSq = inRadius * inRadius; + this.outRadiusSq = outRadius * outRadius; + } + + /** + * 指定された座標がこの台風の暴風域内にあるかどうかを判定 + * + * @param pointX 判定対象のX座標 + * @param pointY 判定対象のY座標 + * @return 座標が暴風域内にある場合はtrue、そうでない場合はfalse + */ + public boolean isInStormRange(int pointX, int pointY) { + // 台風の中心から指定された地点までの距離の2乗を計算 + final int distanceStormSq = (pointX - centerX) * (pointX - centerX) + (pointY - centerY) * (pointY - centerY); + // 距離の2乗が内円の半径の2乗以上、かつ外円の半径の2乗以下であれば暴風域内 + return inRadiusSq <= distanceStormSq && distanceStormSq <= outRadiusSq; + } +} + +/** + * 暴風域判定の結果を標準出力に出力する + * + * @param isInStormRange 暴風域内にあるかどうかの判定結果 + */ +final class PrintStorm { + public static void stormRangeResult(final boolean isInStormRange) { + if (isInStormRange) { + System.out.println("yes"); + } else { + System.out.println("no"); + } + } +} + +public class C021_storm { + public static void main(String[] args) { + final Scanner scanner = new Scanner(System.in); + + final Typhoon typhoon = readTyphoonData(scanner); + final int numberOfPeople = scanner.nextInt(); + + for (int i = 0; i < numberOfPeople; i++) { + final int personX = scanner.nextInt(); + final int personY = scanner.nextInt(); + + final boolean isInStorm = typhoon.isInStormRange(personX, personY); + PrintStorm.stormRangeResult(isInStorm); + } + scanner.close(); + } + + /** + * 標準入力から台風の中心座標と半径を読み込み、Typhoonオブジェクトを生成して返す + * + * @param scanner 標準入力からの読み込みに使用するScannerオブジェクト + * @return 読み込んだデータに基づいて生成されたTyphoonオブジェクト + */ + private static Typhoon readTyphoonData(Scanner scanner) { + final int xc = scanner.nextInt(); + final int yc = scanner.nextInt(); + final int r_1 = scanner.nextInt(); + final int r_2 = scanner.nextInt(); + return new Typhoon(xc, yc, r_1, r_2); + } + +}