hdu 5206 Four Inages Strategy
题目大意:
判断空间上4个点是否形成一个正方形
分析:
标称思想 : 在p2,p3,p4中枚举两个点作为p1的邻点,不妨设为pi,pj,然后判断p1pi与p1pj是否相等、互相垂直,然后由向量法,最后一个点坐标应该为pi+pj−p1,判断是否相等就好了。
我的思想 : 枚举了各种情况,4条边相等+有一个角是直角。后来想想,因为是在三维中,有可能4个点不共面,这点没想到,不过这道题AC了,估计数据水了
1 #include<cstdio> 2 #include<cstring> 3 #include<iostream> 4 #include<string> 5 #include<algorithm> 6 #include<cmath> 7 #include<queue> 8 #include<stack> 9 #include<vector> 10 #define eps 1e-9 11 #define maxn 12 using namespace std; 13 typedef long long LL; 14 struct Node 15 { 16 long long x,y,z; 17 }; 18 Node p[5]; 19 double dist(int a,int b) 20 { 21 double cha1=(double)p[a].x-p[b].x; 22 double cha2=(double)p[a].y-p[b].y; 23 double cha3=(double)p[a].z-p[b].z; 24 return (sqrt(cha1*cha1+cha2*cha2+cha3*cha3)); 25 } 26 int puan(int a,int b,int c) 27 { 28 LL x1=p[b].x-p[a].x; 29 LL y1=p[b].y-p[a].y; 30 LL z1=p[b].z-p[a].z; 31 32 LL x2=p[b].x-p[c].x; 33 LL y2=p[b].y-p[c].y; 34 LL z2=p[b].z-p[c].z; 35 if(x1*x2+y1*y2+z1*z2==0) 36 return 1; 37 return 0; 38 39 } 40 int solve() 41 { 42 double tem1,tem2,tem3,tem4; 43 tem1=dist(1,2); 44 tem2=dist(2,3); 45 tem3=dist(3,4); 46 tem4=dist(4,1); 47 //printf("%lf %lf %lf %lf==\n",tem1,tem2,tem3,tem4); 48 if(fabs(tem1-tem2)<eps&&fabs(tem2-tem3)<eps&&fabs(tem3-tem4)<eps&&puan(1,2,3)) 49 return 1; 50 tem1=dist(1,2); 51 tem2=dist(2,4); 52 tem3=dist(4,3); 53 tem4=dist(3,1); 54 if(fabs(tem1-tem2)<eps&&fabs(tem2-tem3)<eps&&fabs(tem3-tem4)<eps&&puan(1,2,4)) 55 return 1; 56 tem1=dist(1,3); 57 tem2=dist(3,2); 58 tem3=dist(2,4); 59 tem4=dist(4,1); 60 if(fabs(tem1-tem2)<eps&&fabs(tem2-tem3)<eps&&fabs(tem3-tem4)<eps&&puan(1,3,2)) 61 return 1; 62 tem1=dist(1,3); 63 tem2=dist(3,4); 64 tem3=dist(4,2); 65 tem4=dist(2,1); 66 // printf("%lf %lf %lf %lf==\n",tem1,tem2,tem3,tem4); 67 if(fabs(tem1-tem2)<eps&&fabs(tem2-tem3)<eps&&fabs(tem3-tem4)<eps&&puan(1,3,4)) 68 return 1; 69 tem1=dist(1,4); 70 tem2=dist(4,2); 71 tem3=dist(2,3); 72 tem4=dist(3,1); 73 if(fabs(tem1-tem2)<eps&&fabs(tem2-tem3)<eps&&fabs(tem3-tem4)<eps&&puan(1,4,2)) 74 return 1; 75 tem1=dist(1,4); 76 tem2=dist(4,3); 77 tem3=dist(3,2); 78 tem4=dist(2,1); 79 if(fabs(tem1-tem2)<eps&&fabs(tem2-tem3)<eps&&fabs(tem3-tem4)<eps&&puan(1,4,3)) 80 return 1; 81 return 0; 82 } 83 int main() 84 { 85 int t; 86 scanf("%d",&t); 87 for(int ii=1; ii<=t; ii++) 88 { 89 for(int i=1; i<=4; i++) 90 scanf("%I64d %I64d %I64d",&p[i].x,&p[i].y,&p[i].z); 91 printf("Case #%d: ",ii); 92 if(solve()) 93 printf("Yes\n"); 94 else 95 printf("No\n"); 96 97 } 98 return 0; 99 }