题意:给你四个空间坐标点,让你判断这四个点可以围成一个正方形吗?如果是,输出Yes,否则输出No
想法就是枚举 两两之间的距离,4个点就有6个距离,然后从小到大排序 ,前面的4个必须要相等,是四边形的四条边,最后两个较大边也必须要相等,是两条对角线
#include<cstdio>
#include<cstdlib>
#include<cstring>
#include<iostream>
#include<algorithm>
using namespace std;
int main()
{
int t;
scanf("%d",&t);
long long a[10][10];
long long ans[50];//需要用long long
for(int l=1; l<=t; l++)
{
int cnt=0;
int flag=0;
for(int i=0; i<4; i++)
{
for(int j=0; j<3; j++)
{
scanf("%lld",&a[i][j]);
}
}
for(int i=0; i<4; i++)
{
for(int j=i+1; j<4; j++)
{
long long s=(a[i][0]-a[j][0])*(a[i][0]-a[j][0])+(a[i][1]-a[j][1])*(a[i][1]-a[j][1])+(a[i][2]-a[j][2])*(a[i][2]-a[j][2]);
ans[cnt++]=s;
}
}
sort(ans,ans+cnt);
long long ss=ans[3]*2;//上面开平方的话需要用double ,就该是ans[3]*sqrt(2);但是没有必要。
for(int i=0; i<3; i++)
{
if(ans[i]!=ans[i+1])
{
flag=1;
}
}
for(int i=4; i<6; i++)
{
if(ss!=ans[i])
flag=1;
}
printf("Case #%d: ",l);
if(flag==0)
printf("Yes\n");
else
printf("No\n");
}
}