题解
写的时候智障了…枚举所有的点的位置…傻了傻了
正解:总共四个点,只有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;
}