hdu 5206 Four Inages Strategy

题目大意:

判断空间上4个点是否形成一个正方形

分析:

标称思想 : 在p2,p3,p4中枚举两个点作为p1的邻点,不妨设为pipj,然后判断p1pip1pj是否相等、互相垂直,然后由向量法,最后一个点坐标应该为pi+pjp1,判断是否相等就好了。

我的思想 : 枚举了各种情况,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 }

 

posted on 2015-04-18 22:10  tsw123  阅读(205)  评论(0编辑  收藏  举报

导航