题意:给出空间中四个点的坐标 判断能否组成正方形
思路:这题需要注意的是 空间而不是平面
就算是四边相等 对角线相等也不一定就是正方形
还需要通过向量判断对边是否平行
#include<cstdio> #include<cstring> #include<iostream> #include<algorithm> using namespace std; #define ll __int64 //#define ll long long struct node { double x,y,z; }; node a[10]; int cmp(node l,node r) { if(l.x==r.x&&l.y==r.y) return l.z<r.z; if(l.x==r.x) return l.y<r.y; return l.x<r.x; } double sum(node l,node r) { return (l.x-r.x)*(l.x-r.x)+(l.y-r.y)*(l.y-r.y)+(l.z-r.z)*(l.z-r.z); } bool xl() { double x1=a[0].x-a[2].x; double y1=a[0].y-a[2].y; double z1=a[0].z-a[2].z; double x2=a[1].x-a[3].x; double y2=a[1].y-a[3].y; double z2=a[1].z-a[3].z; if(x1*y2==y1*x2&&x1*z2==z1*x2&&y1*z2==z1*y2) { return true; } return false; } int main() { int t; int cas=1; scanf("%d",&t); while(t--) { int ok=0; scanf("%lf%lf%lf%lf%lf%lf%lf%lf%lf%lf%lf%lf",&a[0].x,&a[0].y,&a[0].z,&a[1].x,&a[1].y,&a[1].z,&a[2].x,&a[2].y,&a[2].z,&a[3].x,&a[3].y,&a[3].z); sort(a,a+4,cmp); ll edge1,edge2; ll edge3,edge4; ll dui1,dui2; edge1=sum(a[0],a[1]); edge2=sum(a[0],a[2]); edge3=sum(a[1],a[3]); edge4=sum(a[2],a[3]); dui1=sum(a[1],a[2]); dui2=sum(a[0],a[3]); if(edge1==edge2&&edge3==edge4&&edge2==edge3) { if(dui1==dui2) { if(xl()) { ok=1; } } } if(ok) printf("Case #%d: Yes\n",cas++); else printf("Case #%d: No\n",cas++); } return 0; }
时间: 2024-10-27 11:46:15