小F在祖屋中意外发现一本上古时代传承下来的秘籍,名为《四象阵法》,他按捺不住内心的激动,翻开秘籍,一字一句地读了起来,“用四块元石作为阵基摆放在空间四处位置,如果四块元石形成一个正方形,则阵法激活,有杀敌困敌之效”,小F走遍五湖四海,终于集齐了四块元石,并将四块元石放置在四个坐标点上,可是他不知道阵法是否能够成功激活,于是,由你来告诉他答案。
输入描述
第一行只有一个整数 T(T≤10000) ,表示测试数据组数。接下来有 T 行,每行包括12个整数, x1,y1,z1,x2,y2,z2,x3,y3,z3,x4,y4,z4 ,分别表示四块元石的坐标 |x|,|y|,|z|≤100000 。输入保证没有重点。
输出描述
每组数据输出一行Case # x : ans 。 x 表示组数编号,从1开始,如果阵法能够激活, ans 为Yes,否则为No。
输入样例
2 0 0 0 0 1 0 1 0 0 1 1 0 1 1 1 2 2 2 3 3 3 4 4 4
输出样例
Case #1: Yes Case #2: No
http://acm.hdu.edu.cn/showproblem.php?pid=5206
两种方法:
1.在p2,p3,p4中枚举两个点作为p1的邻点,不妨设为pi,pj,然后判断p1pi与p1pj是否相等、互相垂直,然后由向量法,最后一个点坐标应该为pi+pj−p1,判断是否相等就好了。
#include<iostream>
#include<algorithm>
#include<string>
#include<map>
#include<vector>
#include<cmath>
#include<string.h>
#include<stdlib.h>
#include<cstdio>
#define ll long long
using namespace std;
struct node{
int a,b,c;
};
int main(){
int t;
cin>>t;
int cnt=0;
while(t--){
node x[4];
for(int i=0;i<4;++i)
cin>>x[i].a>>x[i].b>>x[i].c;
int u=0;
for(int i=1;i<4;++i){
for(int j=i+1;j<4;++j){
if((x[i].a-x[0].a)*(x[i].a-x[0].a)+(x[i].b-x[0].b)*(x[i].b-x[0].b)+(x[i].c-x[0].c)*(x[i].c-x[0].c)
==(x[j].a-x[0].a)*(x[j].a-x[0].a)+(x[j].b-x[0].b)*(x[j].b-x[0].b)+(x[j].c-x[0].c)*(x[j].c-x[0].c)){
if((x[i].a-x[0].a)*(x[j].a-x[0].a)+(x[i].b-x[0].b)*(x[j].b-x[0].b)+(x[i].c-x[0].c)*(x[j].c-x[0].c)==0
&&x[6-i-j].a==x[i].a+x[j].a-x[0].a&&x[6-i-j].b==x[i].b+x[j].b-x[0].b&&x[6-i-j].c==x[i].c+x[j].c-x[0].c){
u=1;
break;
}
}
}
}
cout<<"Case #"<<++cnt<<": ";
if(u==0)
cout<<"No"<<endl;
else
cout<<"Yes"<<endl;
}
return 0;
}
2.算出其他三点到一个点的距离,如果有两条相等且长度的平方是另一条的长度的平方的1/2,则为正方形(这题都是整数,数据弱)
#include<stdio.h>
#include<string.h>
int main()
{
int bbs;
int x1,y1,z1,x2,y2,z2,x3,y3,z3,x4,y4,z4;
scanf("%d",&bbs);
int k=1;
while(bbs--)
{
scanf("%d%d%d%d%d%d%d%d%d%d%d%d",&x1,&y1,&z1,&x2,&y2,&z2,&x3,&y3,&z3,&x4,&y4,&z4);
int sum1=(x2-x1)*(x2-x1)+(y2-y1)*(y2-y1)+(z2-z1)*(z2-z1);
int sum2=(x2-x3)*(x2-x3)+(y2-y3)*(y2-y3)+(z2-z3)*(z2-z3);
int sum3=(x2-x4)*(x2-x4)+(y2-y4)*(y2-y4)+(z2-z4)*(z2-z4);
int a,b;
if(sum1==sum2||sum2==sum3||sum3==sum1)
{
if(sum1==sum2)
{
a=sum1;
b=sum3;
}
else if(sum2==sum3)
{
a=sum2;
b=sum1;
}
else
{
a=sum3;
b=sum2;
}
if(a*2==b)
{
printf("Case #%d: Yes\n",k++);
}
else printf("Case #%d: No\n",k++);
}
else
{
printf("Case #%d: No\n",k++);
}
}
return 0;
}