中文题目:《四象阵法》
判断空间四点能否组成正方形。
一次AC,好激动~
#include <algorithm>
#include <iostream>
#include <cstring>
#include <cstdio>
#include <cmath>
typedef long long ll;
using namespace std;
struct point{
int x,y,z;
};
bool isequal(point p1,point p2,point p3,point p4){
int a=pow(p2.x-p1.x , 2)+pow(p2.y-p1.y,2)+pow(p2.z-p1.z,2);
int b=pow(p4.x-p3.x , 2)+pow(p4.y-p3.y,2)+pow(p4.z-p3.z,2);
return a==b;
}
bool isvertical(point p1,point p2,point p3,point p4){
p1.x=p2.x-p1.x;
p1.y=p2.y-p1.y;
p1.z=p2.z-p1.z;
p3.x=p4.x-p3.x;
p3.y=p4.y-p3.y;
p3.z=p4.z-p3.z;
int a=p1.x*p3.x+p1.y*p3.y+p1.z*p3.z;
return a==0;
}
bool istar(point p1,point p2,point p3,point p4){
if(p2.x+p3.x-p1.x != p4.x)return false;
if(p2.y+p3.y-p1.y != p4.y)return false;
if(p2.z+p3.z-p1.z != p4.z)return false;
return true;
}
int main()
{
point p[5];
int t;
scanf("%d",&t);
for(int cs=1;cs<=t;cs++){
printf("Case #%d: ",cs );
for(int i=1;i<=4;++i){
scanf("%d",&p[i].x);
scanf("%d",&p[i].y);
scanf("%d",&p[i].z);
}
if( isequal(p[1],p[2],p[1],p[3]) && isvertical(p[1],p[2],p[1],p[3]) ){
if( istar(p[1],p[2],p[3],p[4]) )printf("Yes\n");
}else if( isequal(p[1],p[2],p[1],p[4]) && isvertical(p[1],p[2],p[1],p[4]) ){
if( istar(p[1],p[2],p[4],p[3]) )printf("Yes\n");
}else if( isequal(p[1],p[3],p[1],p[4]) && isvertical(p[1],p[3],p[1],p[4]) ){
if( istar(p[1],p[3],p[4],p[2]) )printf("Yes\n");
}else{
printf("No\n");
}
}
return 0;
}