青训营X豆包MarsCode 技术训练营第二课 | 豆包MarsCode AI 刷题

74 阅读3分钟

问题描述

给定一个矩形和一个固定点 𝑃P,需要计算一个以点 𝑃P 为圆心的最小圆,使得该圆完全覆盖给定的矩形,并计算该圆的面积。圆的半径是点 𝑃P 到矩形四个顶点中最远距离,而面积可以通过公式 𝐴=𝜋⋅𝑟2A=π⋅r2 来计算。需要注意的是,𝜋π 取值为 3.1415926536。

例如,给定矩形的左下角坐标为 (𝑥1,𝑦1)(x1​,y1​),右上角坐标为 (𝑥2,𝑦2)(x2​,y2​),点 𝑃P 的坐标为 (𝑥𝑃,𝑦𝑃)(xP​,yP​),你需要找到使圆能够完全覆盖矩形的最小面积,面积保留两位小数。


测试样例

样例1:

输入:x1 = 0,y1 = 0,x2 = 1,y2 = 1,xP = 0,yP = 0
输出:'6.28'

样例2:

输入:x1 = -2,y1 = -2,x2 = 2,y2 = 2,xP = 0,yP = 0
输出:'25.13'

样例3:

输入:x1 = -3,y1 = -1,x2 = 1,y2 = 2,xP = 0,yP = 0
输出:'40.84'

最小覆盖圆面积问题

这个问题要求我们计算一个以固定点 ( P ) 为圆心的最小圆,该圆能够完全覆盖给定的矩形,并计算该圆的面积。圆的半径是点 ( P ) 到矩形四个顶点中最远的距离,面积公式为 ( A = \pi \cdot r^2 ),其中 ( \pi ) 取值为 3.1415926536。

问题分析

  1. 目标

    • 计算以点 ( P ) 为圆心的最小圆的面积,该圆完全覆盖给定的矩形。
    • 圆的半径是点 ( P ) 到矩形四个顶点中最远的距离。
  2. 步骤

    • 计算点 ( P ) 到矩形四个顶点的距离
      • 矩形的四个顶点分别为:
        • ( (x_1, y_1) )
        • ( (x_1, y_2) )
        • ( (x_2, y_1) )
        • ( (x_2, y_2) )
      • 计算点 ( P(x_P, y_P) ) 到这四个顶点的距离: [ d = \sqrt{(x_P - x_i)^2 + (y_P - y_i)^2} ] 其中 ( (x_i, y_i) ) 是矩形的四个顶点之一。
    • 找到最大距离
      • 找到点 ( P ) 到四个顶点中的最大距离 ( r ),这就是圆的半径。
    • 计算面积
      • 使用公式 ( A = \pi \cdot r^2 ) 计算圆的面积。
      • 注意,题目要求面积保留两位小数。
  3. 实现细节

    • 使用 Math.sqrt 计算距离。
    • 使用 Math.max 找到最大距离。
    • 使用 String.format 保留两位小数。

代码实现

public class Main {
    public static String solution(int x1, int y1, int x2, int y2, int xP, int yP) {
        // 计算四个顶点的坐标
        int[][] corners = {
            {x1, y1},
            {x1, y2},
            {x2, y1},
            {x2, y2}
        };

        // 初始化最大距离为0
        double maxDistance = 0.0;

        // 计算点 P 到四个顶点的距离,并找到最大距离
        for (int[] corner : corners) {
            double dx = xP - corner[0];
            double dy = yP - corner[1];
            double distance = Math.sqrt(dx * dx + dy * dy);
            if (distance > maxDistance) {
                maxDistance = distance;
            }
        }

        // 计算面积
        double area = 3.1415926536 * maxDistance * maxDistance;

        // 保留两位小数
        return String.format("%.2f", area);
    }

    public static void main(String[] args) {
        System.out.println(solution(0, 0, 1, 1, 0, 0).equals("6.28")); // 输出: true
        System.out.println(solution(-2, -2, 2, 2, 0, 0).equals("25.13")); // 输出: true
        System.out.println(solution(-3, -1, 1, 2, 0, 0).equals("40.84")); // 输出: true
    }
}

代码解释

  1. 计算四个顶点

    • 根据输入的矩形坐标 ( (x_1, y_1) ) 和 ( (x_2, y_2) ),计算矩形的四个顶点。
  2. 计算距离

    • 对于每个顶点,计算点 ( P(x_P, y_P) ) 到该顶点的距离。
    • 使用 Math.sqrt 计算欧几里得距离。
  3. 找到最大距离

    • 使用 Math.max 找到点 ( P ) 到四个顶点中的最大距离,这就是圆的半径。
  4. 计算面积

    • 使用公式 ( A = \pi \cdot r^2 ) 计算面积。
    • 使用 String.format("%.2f", area) 保留两位小数。
  5. 测试样例

    • 样例1:
      • 输入:x1 = 0, y1 = 0, x2 = 1, y2 = 1, xP = 0, yP = 0
      • 输出:"6.28"
    • 样例2:
      • 输入:x1 = -2, y1 = -2, x2 = 2, y2 = 2, xP = 0, yP = 0
      • 输出:"25.13"
    • 样例3:
      • 输入:x1 = -3, y1 = -1, x2 = 1, y2 = 2, xP = 0, yP = 0
      • 输出:"40.84"

结论

通过上述方法,我们可以有效地计算出以点 ( P ) 为圆心的最小覆盖圆的面积。该算法简单且高效,适用于大多数情况。