BC #38 / hdu 5206 Four Inages Strategy

题解

写的时候智障了…枚举所有的点的位置…傻了傻了

正解:总共四个点,只有6条边,sort一下,前四条相等(边),后两条相等(对角线),且要符合勾股定理

如果只有四边相等,对角线相等:
在这里插入图片描述
awsl

为防精度问题,距离直接按平方计算


对了,写的时候发现:

这么写,是对的

for (int cs = 1; cs <= T; ++cs) {
    if(solve()) printf("Case #%d: Yes\n",cs );
     else printf("Case #%d: No\n",cs );
}

这么写,是错的

for (int cs = 1; cs <= T; ++cs) {
    printf("Case #%d: ",cs );
    if(solve()) cout<<"Yes"<<endl;
    else cout<<"No"<<endl;
}

这是为啥?


在这里插入图片描述


#include <bits/stdc++.h>
using namespace std;
typedef long long ll;
int n,m,k;
struct point{
    ll x,y,z;
    void init(){
        cin>>x>>y>>z;
    }

    ll dis(point b){//平方
        return (x-b.x)*(x-b.x)+(y-b.y)*(y-b.y)+(z-b.z)*(z-b.z);
    }
}p[4];
ll d[10];//记录两点间的距离

bool solve(){
    for (int i = 0; i <4; ++i) {
        p[i].init();
    }

    for (int i = 0,t=0; i <4; ++i) {
        for (int j = i+1; j <4; ++j) {
            d[++t]=p[i].dis(p[j]);
        }
    }
    sort(d+1,d+6+1);

    if(d[1]==d[2] && d[2]==d[3] && d[3]==d[4] && d[5]==d[6]
       && d[1]*2==d[5]) return true;
    return false;
}

int main(){
    ios::sync_with_stdio(0);
    int T;
    cin>>T;
    for (int cs = 1; cs <= T; ++cs) {
        if(solve())printf("Case #%d: Yes\n",cs );
        else printf("Case #%d: No\n",cs );
    }
    return 0;
}
发布了34 篇原创文章 · 获赞 0 · 访问量 956

猜你喜欢

转载自blog.csdn.net/Yubing792289314/article/details/104199076
38
今日推荐