hdu 5206 Four Inages Strategy(计算几何)

题意:给出空间中四个点的坐标 判断能否组成正方形

思路:这题需要注意的是 空间而不是平面

         就算是四边相等 对角线相等也不一定就是正方形

         还需要通过向量判断对边是否平行

 

#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;

}

  

你可能感兴趣的:(strategy)