BUPT Summer Journey #test5 B

 

 

时间限制 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;
}

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值