HDU 5029(三维正方形)

来源:互联网 发布:java代码漏洞扫描工具 编辑:程序博客网 时间:2024/05/20 19:30
只需判断四个边相等,并且个向量垂直即可,向量垂直用三维叉积 x1*x2+y1*y2+z1*z2 = 0;
<pre name="code" class="html">#include <cstdio>#include <stack>#include <cstring>#include <iostream>#include <algorithm>#include <cmath>#include <cstdlib>using namespace std;typedef long long LL;#define lson l,m,rt<<1#define rson m+1,r,rt<<1|1double x[5],y[5],z[5];int ans[5],vis[5];double dist(int i,int j){  return (x[i]-x[j])*(x[i]-x[j])+(y[i]-y[j])*(y[i]-y[j])+(z[i]-z[j])*(z[i]-z[j]);}int flag = 0;void dfs(int p){  if(p==4){     double num;     int ok = 1;     for(int j=0;j<4;j++){         int f1 = ans[j],f2=ans[(j+1)%4];         if(j==0) num = dist(f1,f2);         else if(num!=dist(f1,f2)){             ok=0;         }     }     for(int j=0;j<4;j++){       int f1=ans[j],f2=ans[(j+1)%4],f3=ans[(j+2)%4];       int a=x[f1]-x[f2],b=y[f1]-y[f2],c=z[f1]-z[f2];       int a1=x[f2]-x[f3],b2=y[f2]-y[f3],c2=z[f2]-z[f3];       if(a*a1+b*b2+c*c2!=0){          ok=0; break;       }     }        if(ok) {flag = 1;}  return ;  }  for(int i=0;i<4;i++){      if(!vis[i]){          vis[i]=1;          ans[p]=i;          dfs(p+1);          vis[i]=0;      }  }}int main(){  int T,kase=1;  scanf("%d",&T);  while(T--){    x[4] = 0; y[4]=0; z[4]=0;    for(int i=0;i<4;i++){        scanf("%lf %lf %lf",&x[i],&y[i],&z[i]);    }    memset(vis,0,sizeof(vis));    flag = 0;    dfs(0);    printf("Case #%d: %s\n",kase++,flag ? "Yes":"No");  }  return 0;}


                                             
0 0
原创粉丝点击