LeetCode ソリューションの概要 1401. 円と長方形は重なっていますか?

 ディレクトリリンク:

Lituo プログラミングの問題 - 解決策の概要_Share+Records-CSDN ブログ

GitHub 同期ブラッシング プロジェクト:

https://github.com/ September26/java-algorithms

原題へのリンク:リコウ


説明:

(radius, xCenter, yCenter) で示される円と、座標軸に平行な長方形が 与えられます (x1, y1, x2, y2) 。ここで (x1, y1) 、 は長方形の左下隅の座標 (x2, y2) 、 は右上隅の座標です。

円と四角形が重なっている場合は を返し、 true そうでない場合は を返してください false 。

言い換えれば、  円上と四角形の両方上にある 点 の存在を検出します (両方の点が境界上にある場合も含みます)。(xi, yi)

例 1:

入力: radius = 1、xCenter = 0、yCenter = 0、x1 = 1、y1 = -1、x2 = 3、y2 = 1 出力
: true
説明:円と長方形は共通点 (1,0) を持ちます。

例 2:

入力: radius = 1、xCenter = 1、yCenter = 1、x1 = 1、y1 = -3、x2 = 2、y2 = -1
出力: false

例 3:

入力: radius = 1、xCenter = 0、yCenter = 0、x1 = -1、y1 = 0、x2 = 0、y2 = 1
出力: true

ヒント:

  • 1 <= radius <= 2000
  • -104 <= xCenter, yCenter <= 104
  • -104 <= x1 < x2 <= 104
  • -104 <= y1 < y2 <= 104

問題解決のアイデア:

/**

* 1401. 円と長方形が重なるかどうか

* 問題解決のアイデア:

※まず、円の中心が四角形の中にある場合は、そのままtrueを返します。

* 他の場合には、円の中心から長方形までの最短距離を見つける必要があります。

※ x 軸が x1 ~ x2 の範囲にある場合、最も近い距離は min(abs(yCenter - y1), abs(yCenter - y2)) となります。同様に、min(abs(xCenter - x1), abs(xCenter - x2)) も一貫しており、2 つの値のうち小さい方が採用されます。

※いずれも一致しない場合は、4つの頂点から最も近い値が最小値となります。

※計算の都合上、二乗後の値を計算しております。距離 <= pow(radius, 2) が範囲内です。

*/

コード:

class Solution1401
{
public:
    int getDistance(int xCenter, int yCenter, int x, int y)
    {
        return pow(xCenter - x, 2) + pow(yCenter - y, 2);
    }

    bool checkOverlap(int radius, int xCenter, int yCenter, int x1, int y1, int x2, int y2)
    {
        if (((xCenter >= x1 && xCenter <= x2) || (xCenter >= x2 && xCenter <= x1)) && ((yCenter >= y1 && yCenter <= y2) || (yCenter >= y2 && yCenter <= y1)))
        {
            return true;
        }
        int distance = 20000;
        if ((xCenter >= x1 && xCenter <= x2) || (xCenter >= x2 && xCenter <= x1))
        {
            distance = min(abs(yCenter - y1), abs(yCenter - y2));
        }
        if ((yCenter >= y1 && yCenter <= y2) || (yCenter >= y2 && yCenter <= y1))
        {
            distance = min(distance, min(abs(xCenter - x1), abs(xCenter - x2)));
        }
        distance = pow(distance, 2);
        distance = min(distance, getDistance(xCenter, yCenter, x1, y1));
        distance = min(distance, getDistance(xCenter, yCenter, x1, y2));
        distance = min(distance, getDistance(xCenter, yCenter, x2, y1));
        distance = min(distance, getDistance(xCenter, yCenter, x2, y2));
        return distance <= pow(radius, 2);
    }
};

おすすめ

転載: blog.csdn.net/AA5279AA/article/details/131375934