给出三维空间上的四个点(点与点的位置均不相同),判断这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,四个点组成三条边,通过向量行列式的值求体积,如果行列式值为0,就是共面的。
三阶行列式的值比较好求。
代码:
#include <iostream> #include <cstdio> #include <cmath> #include <cstring> #include <algorithm> #define MAX 101 using namespace std; int t,point[4][3],line[3][3]; int main() { scanf("%d",&t); while(t --) { for(int i = 0;i < 4;i ++) { for(int j = 0;j < 3;j ++) { scanf("%d",&point[i][j]); if(i > 0) { line[i - 1][j] = point[i][j] - point[0][j]; } } } int a = line[0][0] * (line[1][1] * line[2][2] - line[1][2] * line[2][1]); int b = line[0][1] * (line[1][2] * line[2][0] - line[1][0] * line[2][2]); int c = line[0][2] * (line[1][0] * line[2][1] - line[1][1] * line[2][0]); if(a + b + c == 0) printf("Yes "); else printf("No "); } }