1 条题解

  • 0
    @ 2025-4-8 15:46:33

    解题思路

    这道题要求根据平面上的三个不共线的点,计算通过这三个点的唯一圆的周长。关键在于找到圆心和半径,然后用公式 ( C = 2\pi r ) 计算周长。


    步骤 1:理解几何条件

    • 三个不共线的点可以唯一确定一个圆。
    • 圆心是这三个点构成的三角形的外心(即三条垂直平分线的交点)。
    • 半径就是圆心到任意一个给定点的距离。

    步骤 2:计算圆心(外心)

    设三个点为 ( A(x_1, y_1) ), ( B(x_2, y_2) ), ( C(x_3, y_3) ),我们需要找到圆心 ( (x_0, y_0) )。

    方法 1:求两条垂直平分线的交点

    1. 计算 AB 的中点和斜率

      • 中点 ( M = \left( \frac{x_1 + x_2}{2}, \frac{y_1 + y_2}{2} \right) )
      • AB 的斜率 ( m_{AB} = \frac{y_2 - y_1}{x_2 - x_1} )(如果 ( x_1 \neq x_2 ))
      • AB 的垂直平分线斜率 ( m_{\perp AB} = -\frac{1}{m_{AB}} )(如果 AB 不水平/垂直)
    2. 计算 AC 的中点和斜率

      • 中点 ( N = \left( \frac{x_1 + x_3}{2}, \frac{y_1 + y_3}{2} \right) )
      • AC 的斜率 ( m_{AC} = \frac{y_3 - y_1}{x_3 - x_1} )(如果 ( x_1 \neq x_3 ))
      • AC 的垂直平分线斜率 ( m_{\perp AC} = -\frac{1}{m_{AC}} )
    3. 求两条垂直平分线的交点(圆心)

      • 解方程组: [ \begin{cases} y - M_y = m_{\perp AB} (x - M_x) \ y - N_y = m_{\perp AC} (x - N_x) \end{cases} ]
      • 特殊情况处理(如某条边水平或垂直):
        • 如果 AB 是垂直的(( x_1 = x_2 )),则 AB 的垂直平分线是水平线 ( y = M_y )。
        • 如果 AB 是水平的(( y_1 = y_2 )),则 AB 的垂直平分线是垂直线 ( x = M_x )。

    方法 2:解圆的方程(推荐)

    圆的方程可以表示为: [ (x - x_0)^2 + (y - y_0)^2 = r^2 ] 由于 ( A ), ( B ), ( C ) 都在圆上,代入得到: [ \begin{cases} (x_1 - x_0)^2 + (y_1 - y_0)^2 = r^2 \ (x_2 - x_0)^2 + (y_2 - y_0)^2 = r^2 \ (x_3 - x_0)^2 + (y_3 - y_0)^2 = r^2 \end{cases} ] 通过前两个方程相减,可以消去 ( r^2 ),得到线性方程: [ (x_1^2 - x_2^2) + (y_1^2 - y_2^2) - 2x_0(x_1 - x_2) - 2y_0(y_1 - y_2) = 0 ] 同理,用第 1 和第 3 个方程相减,得到另一个线性方程: [ (x_1^2 - x_3^2) + (y_1^2 - y_3^2) - 2x_0(x_1 - x_3) - 2y_0(y_1 - y_3) = 0 ] 解这个二元一次方程组即可求出 ( x_0 ) 和 ( y_0 )。


    步骤 3:计算半径

    圆心 ( (x_0, y_0) ) 确定后,半径 ( r ) 就是圆心到任意一点的距离,例如: [ r = \sqrt{(x_1 - x_0)^2 + (y_1 - y_0)^2} ]


    步骤 4:计算周长

    周长公式: [ C = 2 \pi r ] 其中 ( \pi ) 取 3.141592653589793


    步骤 5:处理输入输出

    • 输入:读取 6 个浮点数 ( x_1, y_1, x_2, y_2, x_3, y_3 )。
    • 输出:计算周长并四舍五入到 2 位小数

    c++代码

    #include <iostream>
    #include <cmath>
    #include <iomanip>
    using namespace std;
    
    const double PI = 3.141592653589793;
    
    int main() {
        double x1, y1, x2, y2, x3, y3;
        while (cin >> x1 >> y1 >> x2 >> y2 >> x3 >> y3) {
            // 计算圆心 (x0, y0)
            double A = x2 - x1, B = y2 - y1, C = x3 - x1, D = y3 - y1;
            double E = A * (x1 + x2) + B * (y1 + y2);
            double F = C * (x1 + x3) + D * (y1 + y3);
            double G = 2 * (A * (y3 - y1) - B * (x3 - x1));
            
            if (G == 0) {
                // 三点共线
                continue;
            }
            
            double x0 = (D * E - B * F) / G;
            double y0 = (A * F - C * E) / G;
            
            // 计算半径
            double dx = x1 - x0, dy = y1 - y0;
            double r = sqrt(dx * dx + dy * dy);
            
            // 计算周长
            double circumference = 2 * PI * r;
            
            // 输出,保留 2 位小数
            cout << fixed << setprecision(2) << circumference << endl;
        }
        return 0;
    }
    

    • 1

    信息

    ID
    1243
    时间
    1000ms
    内存
    256MiB
    难度
    10
    标签
    递交数
    1
    已通过
    1
    上传者