ディレクトリリンク:
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);
}
};