牛客练习赛71 B-烙印(判断构成三角形个数)

题目

链接

点此处跳转题目

描述

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,本蒟蒻的简单代码还望大家不要嫌弃

猜你喜欢

转载自blog.csdn.net/m0_52494226/article/details/111351506