文章

【GESP】C++二级练习 luogu-B3638, 三角形面积

GESP二级练习,数学函数练习,难度★✮☆☆☆。

luogu-B3638

题目要求

题目描述

给定平面直角坐标系上的三个整点 $A, B, C$ 的坐标,求其围成的三角形面积。

数据保证答案一定是整数。所以如果你采用了浮点数来计算,请四舍五入到整数


两点之间的距离公式: $(x_1, y_1), (x_2, y_2)$ 之间的距离是 $\sqrt{(x_1 - x_2)^2 + (y_1 - y_2)^2}$

海伦公式: 若三角形的边长为 $a, b, c$,则三角形的面积是 $\sqrt{s(s-a)(s-b)(s-c)}$,其中 $s=\frac12(a+b+c)$.

输入格式

共三行,每行表示一个三角形上的点。 每行包含两个正整数,表示点的坐标,形式为 x y

输出格式

共一行,一个整数,表示三角形面积。

样例输入 #1

1
2
3
10 20
30 40
50 50

样例输出 #1

1
100

样例解释

可以通过海伦公式计算面积。方法如下。

$AB$ 距离:$\sqrt{(30 - 10)^2 + (40 -20)^2} \approx 28.284$
$BC$ 距离:$\sqrt{(50-30)^2 + (50-40)^2} \approx 22.361$
$AC$ 距离:$\sqrt{(50-10)^2+(50-20)^2}\approx 50$

应用海伦公式,$s \approx (28.284 + 22.361 + 50) / 2 \approx 50.323$
求出近似面积: $\sqrt{s(s-a)(s-b)(s-c)} \approx \sqrt{10016.80} \approx 100.08$,故答案为 $100$。

数据规模与约定

对于 $100\%$ 的数据:每个点的 $x, y$ 坐标值一定在 $[1, 200]$ 之内,均为整数;答案一定为正整数。


题目分析

  1. 读取三个点的坐标
  2. 使用sqrt函数计算三个点之间的距离
  3. 计算三角形的半周长
  4. 使用sqrt函数计算三角形的面积
  5. 输出三角形的面积

示例代码

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
#include <cmath>
#include <cstdio>
#include <iostream>
using namespace std;
int main() {
    // 读取三个点的坐标
    int x1, y1, x2, y2, x3, y3;
    cin >> x1 >> y1 >> x2 >> y2 >> x3 >> y3;
    // 计算三个点之间的距离
    double a, b, c;
    a = sqrt((x1 - x2) * (x1 - x2) + (y1 - y2) * (y1 - y2)); // 计算AB距离
    b = sqrt((x1 - x3) * (x1 - x3) + (y1 - y3) * (y1 - y3)); // 计算AC距离
    c = sqrt((x2 - x3) * (x2 - x3) + (y2 - y3) * (y2 - y3)); // 计算BC距离
    // 计算三角形的半周长
    double tmp = (a + b + c) / 2;
    // 计算三角形的面积
    double s = sqrt(tmp * (tmp - a) * (tmp - b) * (tmp - c));
    // 输出三角形的面积
    printf("%.0f", s);
    return 0;
}

所有代码已上传至Github:https://github.com/lihongzheshuai/yummy-code

GESP各级别考纲要点、知识拓展和练习题目清单详见C++学习项目主页

luogu-”系列题目已加入洛谷Java、C++初学团队作业清单,可在线评测,团队名额有限,欢迎加入。

bcqm-”系列题目可在编程启蒙题库进行在线评测。

本文由作者按照 CC BY 4.0 进行授权