(四点共面) 51nod1265 四点共面

。_饼干妹妹 提交于 2021-02-12 22:38:55

1265 四点共面

  1. 1 秒
  2.  
  3. 131,072 KB
  4.  
  5. 0 分
  6.  
  7. 基础题
 
给出三维空间上的四个点(点与点的位置均不相同),判断这4个点是否在同一个平面内(4点共线也算共面)。如果共面,输出"Yes",否则输出"No"。
 收起
 

输入

第1行:一个数T,表示输入的测试数量(1 <= T <= 1000)
第2 - 4T + 1行:每行4行表示一组数据,每行3个数,x, y, z, 表示该点的位置坐标(-1000 <= x, y, z <= 1000)。

输出

输出共T行,如果共面输出"Yes",否则输出"No"。

输入样例

1
1 2 0
2 3 0
4 0 0
0 0 0

输出样例

Yes

四点共面可以化为三条直线共面的问题,而三条直线的共面的必要条件为三条直线的向量所构成的行列式的值为0

C++代码:
#include<iostream>
#include<cstdio>
using namespace std;
struct point{
    double x,y,z;
}p[4];
bool cmp(point a,point b,point c,point d){
    double x1 = a.x - b.x;
    double y1 = a.y - b.y;
    double z1 = a.z - b.z;
    double x2 = a.x - c.x;
    double y2 = a.y - c.y;
    double z2 = a.z - c.z;
    double x3 = a.x - d.x;
    double y3 = a.y - d.y;
    double z3 = a.z - d.z;
    if(x1*y2*z3 + x3*y1*z2 + x2*y3*z1 == x3*y2*z1 + x2*y1*z3 + x1*y3*z2){
        return true;
    }
    else
        return false;
}
int main(){
    int T;
    scanf("%d",&T);
    while(T--){
        for(int i = 0; i < 4; i++)
            cin>>p[i].x>>p[i].y>>p[i].z;
        if(cmp(p[0],p[1],p[2],p[3])){
            printf("Yes\n");
        }
        else{
            printf("No\n");
        }
    }
    return 0;
}

 

标签
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!