はまやんはまやんはまやん

hamayanhamayan's blog

U+1F4A0 [yukicoder 1027]

https://yukicoder.me/problems/no/1027

解説

https://yukicoder.me/submissions/466450

場合分けをして解く。

  1. 円が中にあって、交わってない → D1 * 2 < D2 のとき、0点の交点がある。
  2. 円が中にあって、接している → D1 * 2 == D2 のとき、4点の交点がある。
  3. 円ががっつり交わってる → D1 < D2 のとき、8点の交点がある。
  4. 円が四角形の外側で接している → D1 == D2 のとき、4点の交点がある。
  5. 円が外にあって、交わってない → D1 > D2のとき、0点の交点がある。

こういう場合は境界線だけはっきり考えればOK。
つまり、2番目と4番目の条件をはっきりさせよう。

4番目の「円が四角形の外側で接している」場合は分かりやすい。
円の半径が、四角形の対角線の半分と等しければいいので、sqrt(D1) = sqrt(D2)の場合、つまり、
二乗して、D1=D2のときとなる。

2番目の「円が中にあって、接している」場合がちょっと厄介。
円の半径が、中心から正方形の各辺に対して垂線を引いた時の長さと等しいときになる。
この中心から正方形の各辺に対して垂線を引いた時の長さは、sqrt(2) * sqrt(D2)となる。
これがsqrt(D1)と等しければいいので、どちらも二乗をして、D1=2*D2となればいい。

int D1, D2;
//---------------------------------------------------------------------------------------------------
void _main() {
    cin >> D1 >> D2;

    // 円が中にあって、交わってない
    if (D1 * 2 < D2) cout << 0 << endl;
    // 円が中にあって、接している
    else if (D1 * 2 == D2) cout << 4 << endl;
    // 円ががっつり交わってる
    else if (D1 < D2) cout << 8 << endl;
    // 円が四角形の外側で接している
    else if (D1 == D2) cout << 4 << endl;
    // 円が外にあって、交わってない
    else cout << 0 << endl;
}