B. 立方体 2014新生暑假个人排位赛05
时间限制 1000 ms
内存限制 65536 KB
题目描述
已经知道一个正立方体的7个顶点的坐标,求最后顶点的坐标。
输入格式
第一行一个整数t,表示组数,t<1000。接下来每组数据有7行,每行三个整数,分别表示各点的x,y,z坐标,每个坐标的范围为[-1e6,1e6]。
输出格式
每组数据输出一行,所求顶点的坐标。
输入样例
2
0 0 0
0 0 1
0 1 0
0 1 1
1 0 0
1 0 1
1 1 0
0 3 0
4 0 0
7 4 0
3 7 0
4 0 5
7 4 5
0 3 5
输出样例
1 1 1
3 7 5
思路:对于每一个点,枚举三个其他的点,判断他们连出的向量是否两两垂直,若两两垂直,则可以算出对面的点,再枚举看是否改点在点集中,若不在则为该点。由于数据比较小,时间O(T*7^5)不会超时,也比较稳妥。
代码:
#include<iostream>
#include<cstdio>
#include<cstdlib>
#include<cstring>
#include<cmath>
#include<algorithm>
//#define LOCAL
using namespace std;
struct point
{
int x,y,z;
}p[10];
int flag,x,y,z,xt,yt,zt;
int main()
{
#ifdef LOCAL
freopen("input.txt","r",stdin);
#endif // LOCAL
int T;
scanf("%d",&T);
while(T--)
{
for(int i=1;i<=7;i++)scanf("%d%d%d",&p[i].x,&p[i].y,&p[i].z);
//for(int i=1;i<=7;i++)printf("%d %d %d\n",p[i].x,p[i].y,p[i].z);
flag=0;
for(int i=1;i<=7;i++)
{
for(int p1=1;p1<=7;p1++)
{
for(int p2=1;p2<=7;p2++)
{
for(int p3=1;p3<=7;p3++)
{
//printf("i=%d p1=%d p2=%d p3=%d\n",i,p1,p2,p3);
int dx1=p[p1].x-p[i].x,dy1=p[p1].y-p[i].y,dz1=p[p1].z-p[i].z;
int dx2=p[p2].x-p[i].x,dy2=p[p2].y-p[i].y,dz2=p[p2].z-p[i].z;
int dx3=p[p3].x-p[i].x,dy3=p[p3].y-p[i].y,dz3=p[p3].z-p[i].z;
if(!((dx1*dx2+dy1*dy2+dz1*dz2)==0&&(dx1*dx3+dy1*dy3+dz1*dz3)==0&&(dx2*dx3+dy2*dy3+dz2*dz3)==0))continue;
/*printf("dx1*dx2+dy1*dy2+dz1*dz2=%d dx1*dx3+dy1*dy3+dz1*dz3=%d dx2*dx3+dy2*dy3+dz2*dz3=%d\n",dx1*dx2+dy1*dy2+dz1*dz2,dx1*dx3+dy1*dy3+dz1*dz3,dx2*dx3+dy2*dy3+dz2*dz3);
printf("x=%d y=%d z=%d\n",p[i].x,p[i].y,p[i].z);
printf("x1=%d y1=%d z1=%d\n",p[p1].x,p[p1].y,p[p1].z);
printf("x2=%d y2=%d z2=%d\n",p[p2].x,p[p2].y,p[p2].z);
printf("x3=%d y3=%d z3=%d\n",p[p3].x,p[p3].y,p[p3].z);
printf("dx1=%d dy1=%d dz1=%d\n",dx1,dy1,dz1);
printf("dx2=%d dy2=%d dz2=%d\n",dx2,dy2,dz2);
printf("dx3=%d dy3=%d dz3=%d\n",dx3,dy3,dz3);*/
x=p[i].x+dx1+dx2+dx3;
y=p[i].y+dy1+dy2+dy3;
z=p[i].z+dz1+dz2+dz3;
flag=1;
//if(x==7&&y==4&&z==5){int j=6;printf("%d %d %d\n",p[j].x,p[j].y,p[j].z);}
for(int j=1;j<=7;j++)if(x==p[j].x&&y==p[j].y&&z==p[j].z){flag=0;break;}
if(flag){xt=x;yt=y;zt=z;}
}
}
}
}
printf("%d %d %d\n",xt,yt,zt);
}
return 0;
}