zoukankan      html  css  js  c++  java
  • 四点共面

    基准时间限制:1 秒 空间限制:131072 KB 分值: 0 难度:基础题
     收藏
     关注
    给出三维空间上的四个点(点与点的位置均不相同),判断这4个点是否在同一个平面内(4点共线也算共面)。如果共面,输出"Yes",否则输出"No"。
    Input
    第1行:一个数T,表示输入的测试数量(1 <= T <= 1000)
    第2 - 4T + 1行:每行4行表示一组数据,每行3个数,x, y, z, 表示该点的位置坐标(-1000 <= x, y, z <= 1000)。
    Output
    输出共T行,如果共面输出"Yes",否则输出"No"。
    Input示例
    1
    1 2 0
    2 3 0
    4 0 0
    0 0 0
    Output示例
    Yes


    思路:算出四个点构成的任意三个向量的叉积|x1,y1,z1|,也就是算出一个3x3的行列式的结果,若积为零则代表四点共面
                        |x2,y2,z2|
                        |x3,y3,z3|


    #include<iostream>
    #include<algorithm>
    #include<cstdio>
    
    using namespace std;
    int T;
    struct p{
        double x,y,z;
    }a[5];
    double cat[4][4];
    bool solve()
    {//计算 ab,bc,cd 三条向量边的的叉乘是否为0 为零则共面
        for(int i=1;i<=3;i++){
            cat[i][1] = a[i].x - a[i+1].x;
            cat[i][2] = a[i].y - a[i+1].y;
            cat[i][3] = a[i].z - a[i+1].z;
        }
        double ans = cat[1][1]*cat[2][2]*cat[3][3]+cat[1][2]*cat[2][3]*cat[3][1];
               ans += cat[1][3]*cat[2][1]*cat[3][2];
               ans -= (cat[1][3]*cat[2][2]*cat[3][1]+cat[1][2]*cat[2][1]*cat[3][3]);
               ans -= cat[1][1]*cat[2][3]*cat[3][2];
        if(ans==0)return true;
        return false;
    }
    int main()
    {
        scanf("%d",&T);
        while(T--){
            for(int i=1;i<=4;i++)
                scanf("%lf%lf%lf",&a[i].x,&a[i].y,&a[i].z);
            if(solve()) printf("Yes
    ");
            else printf("No
    ");
        }
        return 0;
    }
  • 相关阅读:
    ribbon--eureka注册中心消费者
    eureka注册中心
    spring cloud简介
    Quartz定时任务
    ThreadLocal
    分布式单点登录SSO
    dubbo框架
    注册中心
    centos安装zookeeper及搭建集群
    7.19 基础数据结构选讲
  • 原文地址:https://www.cnblogs.com/wangrunhu/p/9405041.html
Copyright © 2011-2022 走看看