您的位置:首页 > 其它

BOJ 431. 立方体

2014-07-25 19:39 190 查看
题意:给出三维坐标中正方体的7个点,求出另外一个点。

思路:给出七个点,我们可以暴力的求出任何两个点之间的距离,最长的距离就是正方体的体对角线,而其中点就是正方体的重心。

通过比对体对角线的长度,我们可以找到唯一一个无法配对的点,那该点的沿重心的连线会到待求的点。可以得到答案。

代码如下:

#include <cstdio>
#include <algorithm>
#include <cmath>
#include <set>
#include <cstring>

using namespace std;

struct point{
int x,y,z;
point(int a = 0,int b = 0,int c = 0):x(a),y(b),z(c){}
double dist(const point & a){
return ((x - a.x) * (x -a.x) + (y - a.y) * (y -a.y) + (z -a.z) * (z - a.z));
}
};

point cube[8];
long long d[8][8];

int main(void)
{
int T;
scanf("%d", &T);
while(T--){
bool used[7] = {false};
long long mx,my,mz;
long long len = 0;
memset(d,0,sizeof(d));
for(int i = 0 ; i < 7; ++i)
scanf("%d %d %d", &cube[i].x,&cube[i].y,&cube[i].z);
for(int i = 0 ; i < 7; ++i)
for(int j = 0; j <= i; ++j){
d[i][j] = d[j][i] = cube[i].dist(cube[j]);
if(d[i][j] > len){
len = d[i][j];
mx = cube[i].x + cube[j].x;
my = cube[i].y + cube[j].y;
mz = cube[i].z + cube[j].z;
}
}
for(int i = 0; i < 7; ++i)
for(int j = 0; j <=i; ++j)
if(len == d[i][j])
used[i] = used[j] = true;
point tmp;
for(int i = 0 ; i< 7; ++i)
if(!used[i]){
tmp = cube[i];
break;
}
long long x = mx - tmp.x;
long long y = my - tmp.y;
long long z = mz - tmp.z;
printf("%lld %lld %lld\n",x,y,z);
}
return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: