题解:P5735 【深基7.例1】距离函数

· · 题解

题目传送门

首先,要求三角形的周长,首先就要分别求出三边的长度,最后相加即可得三角形的周长。

然后,就要先解决一条边,找到公式,然后以此类推得出三条边分别的长度。
这里,依据题意,题目中给出了一条线段的两个点,求距离,且告诉了我们距离公式。下面给出证明:

如图,过点 B 作垂直于 x 轴的垂线,过点 Ay 轴的垂线,两线交于点 C,根据平行线的性质,易得 AC ⊥ BC,所以 △ABCRt△

再介绍一个公式:

Rt△ 中,两条直角边长度平方的和等于斜边长度的平方。

在文末有相关证明。

回到题中,根据勾股定理,可得:

AB^2=AC^2+BC^2

AC=x_2-x_1BC=y_2-y_1 代入上式,得:

AB^2=(x_2-x_1)^2+(y_2-y_1)^2

两边同时开方,得:

AB=\sqrt{(x_2-x_1)^2+(y_2-y_1)^2}

得证。

接着,我们分别把 (x_1,y_1)(x_2,y_2)(x_2,y_2)(x_3,y_3)(x_3,y_3)(x_1,y_1) 这三组线段分别使用上述公式计算出三边长度。

这里,两点距离的公式使用了三次,就可以把这个公式做成一个函数。

double dis(double x1, double y1, double x2, double y2) {
    double a, b, c;
    a = x1 - x2;
    b = y1 - y2;
    c = sqrt(a * a + b * b);
    return c;
}

最后,处理输入、计算、输出等小事,整个程序就结束了。

代码:

#include<bits/stdc++.h>
using namespace std;
double dis(double x1, double y1, double x2, double y2) {
    double a, b, c;
    a = x1 - x2;
    b = y1 - y2;
    c = sqrt(a * a + b * b);
    return c;
}
int main() {
    double c = 0, x1, y1, x2, y2, x3, y3;
    cin >> x1 >> y1 >> x2 >> y2 >> x3 >> y3;
    c = dis(x1, y1, x2, y2) + dis(x2, y2, x3, y3) + dis(x3, y3, x1, y1);
    printf("%.2lf", c);
    return 0;
}

附:勾股定理证明

如图,大正方形的面积为 (a+b)^2,小正方形的面积为 c^2,一个直角三角形的面积 \frac{ab}{2}

我们把 (a+b)^2 展开,得:

(a+b)^2=a^2+2ab+b^2

又因为大正方形面积减小正方形面积等于四个三角形面积,可得:

a^2+2ab+b^2-c^2=\frac{ab}{2}×4=2ab

两边同时减去 2ab,得:

a^2+b^2-c^2=0

最后,移项得:

a^2+b^2=c^2

证毕。