具体思路就是求出三边长度然后判断a^2+b^2是否等于c^2;但其中有一点细节性的问题:浮点数直接判断相等可能会翻车。计算机专业的朋友在机组里学过IEEE协议(没学过的朋友可以百度一下),直接用==判断两个浮点数相等由于精度问题是非常不明智的选择。我这里有两种思路。

1.设定一个精度下限e=0.00000(多少个0看自己喜欢)00001,如果两个浮点数的差值小于e,则可近似认为两个浮点数相等。

例:if ( abs(a - b) < e ) //则a=b

2.是我在网上发现的奇淫技巧

例:if ( !(a > b) || a < b) ) // 则a=b

这个方法的巧妙之处就在于避免了直接判断相等,无论精度如何,两个数的大小是可以直接判断的,如果a和b相等,那么a>b 和 a<b 都是false,或运算之后为false再取反为true;如果a,b不相等,那么a>b 和 a<b 中有一个为true,或运算之后结果为true再取反为false。

其余的部分就不用多说了,不涉及任何算法和数据结构,由于准备复试刷题走量不走质量,代码比较丑还请原谅orz.

#include <iostream>
#include <cmath>
#include <cstdio>
using namespace std;

int main() {
    int m;
    double x1,x2,x3,y1,y2,y3;
    double a,b,c;
    double x,y,z;
    cin >> m;
    while ( m -- ) { 
        cin >> x1 >> y1 >> x2 >> y2 >> x3 >> y3;
        a = pow(x1-x2,2)+pow(y1-y2,2);
        b = pow(x1-x3,2)+pow(y1-y3,2);
        c = pow(x2-x3,2)+pow(y2-y3,2);
        x = min(min(a,b),c);
        z = max(max(a,b),c);
        y = a + b + c - x - z;
        if ( !( x+y > z || x+y < z ) ) cout << "Yes" << endl;
        else cout << "No" << endl;
        printf("%.2f\n",sqrt(a)+sqrt(b)+sqrt(c));
    }
    return 0;
}