题解:洛谷 P5717 三角形分类
【题目来源】
【题目描述】
给出三条线段 \(a,b,c\) 的长度,均是不大于 \(10000\) 的正整数。打算把这三条线段拼成一个三角形,它可以是什么三角形呢?
- 如果三条线段不能组成一个三角形,输出
Not triangle; - 如果是直角三角形,输出
Right triangle; - 如果是锐角三角形,输出
Acute triangle; - 如果是钝角三角形,输出
Obtuse triangle; - 如果是等腰三角形,输出
Isosceles triangle; - 如果是等边三角形,输出
Equilateral triangle。
如果这个三角形符合以上多个条件,请按以上顺序分别输出,并用换行符隔开。
【输入】
输入 \(3\) 个整数 \(a\)、\(b\) 和 \(c\)。
【输出】
输出若干行判定字符串。
【输入样例】
3 3 3
【输出样例】
Acute triangle
Isosceles triangle
Equilateral triangle
【核心思想】
-
问题分析:给定三条线段长度 \(a, b, c\),判断能否组成三角形,若能则进一步判断其类型(直角、锐角、钝角、等腰、等边)。输出时按题目给定顺序,多个条件满足时分别输出。
-
算法选择:
- 排序预处理:将三边升序排序,使 \(a \le b \le c\),便于后续判断
- 三角形判定:检查 \(a + b > c\)(两边之和大于第三边)
- 角度类型判定:利用余弦定理的平方形式——比较 \(a^2 + b^2\) 与 \(c^2\):
- 等于:直角三角形
- 大于:锐角三角形
- 小于:钝角三角形
- 边关系判定:检查等边(\(a=b=c\))和等腰(\(a=b\) 或 \(b=c\))
-
关键步骤:
- 读入数据:
cin >> a >> b >> c - 排序:三次
swap保证 \(a \le b \le c\) - 计算平方:
t1 = a*a + b*b,t2 = c*c - 分类判断:
- 若
a + b <= c:输出Not triangle - 否则:
t1 == t2:输出Right trianglet1 > t2:输出Acute trianglet1 < t2:输出Obtuse trianglea == b || b == c:输出Isosceles trianglea == b && b == c:输出Equilateral triangle
- 若
- 读入数据:
-
时间/空间复杂度:
- 时间复杂度:\(O(1)\),固定次数的比较和计算
- 空间复杂度:\(O(1)\),仅需常数个变量
-
几何分类的核心思想:
- 排序简化判断:排序后 \(c\) 为最长边,只需判断 \(a+b>c\) 即可确定三角形,且角度判断只需比较 \(a^2+b^2\) 与 \(c^2\)
- 平方避免浮点:用 \(a^2+b^2\) 与 \(c^2\) 比较替代余弦值比较,避免浮点精度问题
- 条件独立性:角度类型和边关系类型独立判断,满足多个条件时分别输出
- 等边包含等腰:等边三角形必然满足等腰条件,两者都会输出
- 适用于几何分类、条件判断、排序预处理类入门问题
【算法标签】
入门 #模拟
【代码详解】
#include <bits/stdc++.h> // 包含标准库头文件(万能头文件)
using namespace std; // 使用标准命名空间
/**
* 主函数 - 程序入口
* @return 程序执行状态码(0表示成功)
*/
int main()
{
int a, b, c; // 定义三角形三边长度
int t1, t2; // 定义临时变量用于存储平方和
cin >> a >> b >> c; // 输入三条边长
// 对三边进行排序(升序)
if (a > b) swap(a, b);
if (b > c) swap(b, c);
if (a > b) swap(a, b);
// 计算两边平方和与最长边平方
t1 = a * a + b * b;
t2 = c * c;
// 判断三角形类型
if (a + b <= c)
{
// 不满足三角形两边之和大于第三边
cout << "Not triangle" << endl;
}
else
{
// 判断直角三角形
if (t1 == t2)
cout << "Right triangle" << endl;
// 判断锐角三角形
if (t1 > t2)
cout << "Acute triangle" << endl;
// 判断钝角三角形
if (t1 < t2)
cout << "Obtuse triangle" << endl;
// 判断等腰三角形
if (a == b || b == c)
cout << "Isosceles triangle" << endl;
// 判断等边三角形
if (a == b && b == c)
cout << "Equilateral triangle" << endl;
}
return 0; // 程序正常结束
}
【运行结果】
1 14 5
Not triangle
浙公网安备 33010602011771号