1265 四点共面
给出三维空间上的四个点(点与点的位置均不相同),判断这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 "); } else{ printf("No "); } } return 0; }