题目
链接
描述
Ynoi 是一个可爱的女孩子,她想要设计一个独特的烙印。
Ynoi 认为,烙印必须得是一个三角形的。但是她太忙了,所以她找到了 syksykCCC 帮忙。
syksykCCC 接到这个任务后,觉得太简单了,所以他给了这个三角形 3 个限制。众所周知,三角形的六要素是三条边和三个角,所以 syksykCCC 规定了其中三个元素的值,他现在想要考考你,满足这 3 个条件的三角形有多少种?
输入
每个测试点的第一行是一个正整数 T,表示有多少组数据。
每组数据包含六个正整数,分别记作 a,b,c,∠A,∠B,∠C。前三个表示三条边,单位是厘米,后三个表示三个角,单位是度数。如果这个数据不给出,则用 −1 代替。规定 a 的对角为 ∠Ab 的对角为∠B,c 的对角为∠C。
输出
对于每组数据,输出一个整数,表示可以得到的不全等的烙印的数量。如果没有符合要求的烙印输出 0,有无限符合要求的输出 “syksykCCC”。
题解
题目简化
给定3个边角条件判断构成几个三角形
思路及情况
1.每一种情况前先判断是否能构成三角形,否:输出0,是:往下判断
2.给定3角,无限个
3.给定2角,1个(角角边、角边角)
4.给定1角,
边角边:1个;
边边角:
· 直角、钝角——1个,
· 锐角——
· · ·若角对边是最大边,1个,反之,判断角所对直角边
· · · · · 对边<直角边(不存在);
· · · · · 对边=直角边(需要算PI的误差):1个;
· · · · · 对边>直角边:2个
5.给定0角,1个(边边边)
重点:需要考虑清楚全部情况
代码
#include<iostream>
#include<cmath>
const double PI = 3.14159265;
const double minx = 1e-7;
using namespace std;
int main() {
int t, a, b, c, d, A, B, C, ans, bian = 0, jiao;
double zjb;
cin >> t;
for (int i = 1; i <= t; i++) {
jiao = 0;
cin >> a >> b >> c >> A >> B >> C;
if (a == -1) {
jiao++;
}
if (b == -1) {
jiao++;
}
if (c == -1) {
jiao++;
}
if (jiao == 3) {
if (A + B + C != 180) {
cout << 0 << endl;//构不成三角形
}
else {
cout << "syksykCCC" << endl;//jjj
}
}
else if (jiao == 0) {
if (a + b > c && a + c > b && b + c > a) {
//是否构成三角形
cout << 1 << endl;//bbb
}
else {
cout << 0 << endl;
}
}
else if (jiao == 2) {
if ((A + B + C >= 179)) {
//是否构成三角形
cout << 0 << endl;
}
else {
cout << 1 << endl;//jbj、jjb
}
}
else {
if ((A != -1 && b != -1 && c != -1) || (B != -1 && a != -1 && c != -1) || (C != -1 && a != -1 && b != -1)) {
cout << 1 << endl;//bjb
}//下面是bbj,要分情况判断
else if (A + B + C >= 88) {
//钝角、直角
//给定的角的对边一定是最大的,否则构不成三角形
if (A != -1) {
if (a > b && a > c) {
cout << 1 << endl;
}
else {
cout << 0 << endl;
}
}
if (B != -1) {
if (b > a && b > c) {
cout << 1 << endl;
}
else {
cout << 0 << endl;
}
}
if (C != -1) {
if (c > b && c > a) {
cout << 1 << endl;
}
else {
cout << 0 << endl;
}
}
}
else {
//bbj锐角
if (A != -1) {
if (b != -1) {
c = b;
}
zjb = (double)sin((double)A / 180.0 * PI) * c;
//cout << zjb << " " << b << endl;
if ((double)a < zjb) {
//构不成三角形
cout << 0 << endl;
}
else if (fabs((double)a - zjb) < minx) {
//先算误差允许范围内
cout << 1 << endl;
}
else if (a >= c) {
//即A,锐角是最大的角,不可能再画出钝角情况
cout << 1 << endl;
}
else {
cout << 2 << endl;
}
}
if (B != -1) {
if (c != -1) {
a = c;
}
zjb = (double)sin((double)B / 180.0 * PI) * a;
//cout << zjb << " " << b << endl;
if ((double)b < zjb) {
cout << 0 << endl;
}
else if (fabs((double)b - zjb) < minx) {
cout << 1 << endl;
}
else if (b >= a) {
cout << 1 << endl;
}
else {
cout << 2 << endl;
}
}
if (C != -1) {
if (b != -1) {
a = b;
}
zjb = (double)sin((double)C / 180.0 * PI) * a;
if ((double)c < zjb) {
cout << 0 << endl;
}
else if (fabs((double)c - zjb) < minx) {
cout << 1 << endl;
}
else if (c >= a) {
cout << 1 << endl;
}
else {
cout << 2 << endl;
}
}
}
}
}
return 0;
}
蒟蒻的收获
1、算误差
const double minx = 1e-7;
fabs((double)a - zjb) < minx
2、sin的使用
#include<cmath>
const double PI = 3.14159265;
zjb = (double)sin((double)C / 180.0 * PI) * a;
3、三角形全等定理
一个把初中知识全还给班主任的蒟蒻复习了三角形全等定理,三角形构成
后记
这是蒟蒻的第一篇博客,蒟蒻太菜了代码长度达到了4000,本蒟蒻的简单代码还望大家不要嫌弃