HDU 5206

来源:互联网 发布:淘宝 新增网站推广 编辑:程序博客网 时间:2024/06/04 01:03

恩。。。数学题。。。差点就不会了。。。

第一个点为参照,找到另外两个点,构成两条向量,垂直,模相等,然后对于剩下的那个点,看是否能和两个点构成垂直的两条向量。。

其实我是做的好烦躁,所以过来刷水题的。。恩。。

#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;}


0 0
原创粉丝点击