题解:洛谷 P5735 距离函数

【题目来源】

洛谷:P5735 【深基7.例1】距离函数 - 洛谷

【题目描述】

给出平面坐标上不在一条直线上三个点坐标 \((x_1,y_1),(x_2,y_2),(x_3,y_3)\),坐标值是实数,且绝对值不超过 \(100.00\),求围成的三角形周长。保留两位小数。

对于平面上的两个点 \((x_1,y_1),(x_2,y_2)\),则这两个点之间的距离\(dis =\sqrt {(x_2-x_1)^2+(y_2-y_1)^2}\)

【输入】

输入三行,第 \(i\) 行表示坐标 \((x_1,y_1)\),以一个空格隔开。

【输出】

输出一个两位小数,表示由这三个坐标围成的三角形的周长。

【输入样例】

0 0
0 3
4 0

【输出样例】

12.00

【核心思想】

  1. 问题分析:给定平面上三个点的坐标,且三点不共线,要求计算由这三个点构成的三角形的周长。根据距离公式分别计算三条边的长度,然后求和。这是一个基础几何计算问题,主要考查浮点数运算和函数定义。

  2. 算法选择

    • 直接计算:根据两点间距离公式 \(d = \sqrt{(x_2-x_1)^2 + (y_2-y_1)^2}\) 分别计算三边长度,然后求和。使用 sqrt 函数进行开方运算,结果保留两位小数。
  3. 关键步骤

    • 读入:读取三个点的坐标 (x1,y1), (x2,y2), (x3,y3)
    • 计算三边长度
      • dis12 = sqrt((x1-x2)^2 + (y1-y2)^2)
      • dis23 = sqrt((x2-x3)^2 + (y2-y3)^2)
      • dis31 = sqrt((x3-x1)^2 + (y3-y1)^2)
    • 求和并输出perimeter = dis12 + dis23 + dis31,使用 printf("%.2f", perimeter) 输出保留两位小数。
  4. 时间/空间复杂度

    • 时间复杂度:\(O(1)\),仅进行常数次浮点运算。
    • 空间复杂度:\(O(1)\),仅使用常数个变量。
  5. 数学与函数封装

    • 距离函数:将距离计算封装为函数,提高代码可读性和复用性。
    • 浮点数精度:坐标值为实数,使用 double 类型保证精度,输出时保留两位小数。
    • 适用场景:这种基础几何计算问题,是学习函数定义和浮点数处理的良好示例。

【算法标签】

入门 #模拟

【代码详解】

#include <bits/stdc++.h>  // 包含标准库头文件(万能头文件)
using namespace std;      // 使用标准命名空间

/**
 * 计算两点之间的欧式距离
 * @param x1 第一个点的x坐标
 * @param y1 第一个点的y坐标
 * @param x2 第二个点的x坐标
 * @param y2 第二个点的y坐标
 * @return 两点之间的距离
 */
double dis(double x1, double y1, double x2, double y2);

int main()
{
    double x1, x2, x3, y1, y2, y3;  // 定义变量:三个点的坐标
    double ab, ac, bc;               // 定义变量:存储三条边的长度
    double ans;                      // 定义变量:存储三角形周长

    // 输入三个点的坐标
    cin >> x1 >> y1 >> x2 >> y2 >> x3 >> y3;

    // 计算三条边的长度
    ab = dis(x1, y1, x2, y2);  // 边AB的长度
    ac = dis(x1, y1, x3, y3);  // 边AC的长度
    bc = dis(x2, y2, x3, y3);  // 边BC的长度

    // 计算三角形周长
    ans = ab + ac + bc;

    // 输出结果,保留两位小数
    printf("%.2f", ans);

    return 0;  // 程序正常结束
}

/**
 * 计算两点之间的欧式距离
 * @param x1 第一个点的x坐标
 * @param y1 第一个点的y坐标
 * @param x2 第二个点的x坐标
 * @param y2 第二个点的y坐标
 * @return 两点之间的距离
 */
double dis(double x1, double y1, double x2, double y2)
{
    double ans;  // 定义变量:存储距离计算结果

    // 计算两点间距离的平方
    ans = (x1 - x2) * (x1 - x2) + (y1 - y2) * (y1 - y2);

    // 开平方得到实际距离
    ans = sqrt(ans);

    return ans;  // 返回计算结果
}

【代码运行】

0 0
0 3
4 0
12.00
posted @ 2026-08-31 09:27  团爸讲算法  阅读(13)  评论(0)    收藏  举报