给出三维空间上的四个点(点与点的位置均不相同),判断这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),(x2,y2,z2),(x3,y3,z3)
判断行列式
| x1 x2 x3|
| y1 y2 y3|
| z1 z2 z3|
或者它的转置是否为零
若为零则四点共面
*/
即三个向量的混合积为0
/* data:2018.5.13 author:gsw link:http://www.51nod.com/onlineJudge/questionCode.html#!problemId=1256 */ #define ll long long #define IO ios_with_sync(false); #include<iostream> #include<algorithm> #include<math.h> #include<stdio.h> #include<string.h> using namespace std; ll t,x1,y11,z1,x2,y2,z2,x3,y3,z3; int main() { scanf("%lld",&t); for(int i=0;i<t;i++) { ll a1,a2,b1,b2,c1,c2; cin >> a1>>b1>>c1; cin >> a2>>b2>>c2; x1=a2-a1,y11=b2-b1,z1=c2-c1; cin >> a2>>b2>>c2; x2=a2-a1,y2=b2-b1,z2=c2-c1; cin >> a2>>b2>>c2; x3=a2-a1,y3=b2-b1,z3=c2-c1; if((x1*y2*z3+x2*y3*z1+x3*y11*z2-x1*z2*y3-y11*x2*z3-z1*y2*x3)==0) cout<<"Yes"<<endl; else cout<<"No"<<endl; } }