恩。。。数学题。。。差点就不会了。。。
第一个点为参照,找到另外两个点,构成两条向量,垂直,模相等,然后对于剩下的那个点,看是否能和两个点构成垂直的两条向量。。
其实我是做的好烦躁,所以过来刷水题的。。恩。。
#include <stdio.h>
#include <stdlib.h>
int x[5],y[5],z[5];
int dis(int i,int j,int k)
{
// printf("%d %d %d %d %d %d %d %d %d\n",x[i]-x[k],(x[i]-x[j]), (x[i]-x[k])*(x[i]-x[j]),y[i]-y[k],y[i]-y[j],(y[i]-y[k])*(y[i]-y[j]),z[i]-z[k],z[i]-z[j],(z[i]-z[k])*(z[i]-z[j]));
return (x[i]-x[k])*(x[i]-x[j])+(y[i]-y[k])*(y[i]-y[j])+(z[i]-z[k])*(z[i]-z[j]);
}
int dist(int i,int j,int k)
{
long long r1=abs(x[i]-x[j])*abs(x[i]-x[j])+abs(y[i]-y[j])*abs(y[i]-y[j])+abs(z[i]-z[j])*abs(z[i]-z[j]);
long long r2=abs(x[i]-x[k])*abs(x[i]-x[k])+abs(y[i]-y[k])*abs(y[i]-y[k])+abs(z[i]-z[k])*abs(z[i]-z[k]);
if(r1==r2) return 1;
else return 0;
}
void print(int i){printf("x=%d y=%d z=%d\n",x[i],y[i],z[i]);}
int main()
{
int T;
scanf("%d",&T);
int cas=1;
for(cas=1;cas<=T;cas++)
{
int i,j,k;
for(i=0;i<4;i++)
{
scanf("%d%d%d",&x[i],&y[i],&z[i]);
}
int flag=0;
for(i=1;i<4;i++)
{
for(j=1;j<4;j++)
{
if(j==i) continue;
int tmp=dis(0,i,j);
// print(i);print(j);printf("\n");
if(tmp==0&&dist(0,i,j))
{
for(k=1;k<4;k++)
if(k!=i&&k!=j) break;
if(dis(k,i,j)==0) {flag=1;break;}
}
}
if(flag) break;
}
printf("Case #%d: ",cas);
if(flag) printf("Yes\n");else printf("No\n");
}
return 0;
}