51nod1265 四点共面
传送门:51nod1265 四点共面
Input示例
1 1 2 0 2 3 0 4 0 0 0 0 0Output示例
Yes
/*根据所学的线代可知:可以由4个点构成3个向量, 3个向量共面的充要条件是向量为x, y, z,
存在实数a,b,c不全为零,使得ax+by+cz=0, 转化为线性代数的3个向量线性相关的行列式为0。
如下,计算三阶行列式——沙路法
|x[0] y[0] z[0]|
|x[1] y[1] z[1]|
|x[2] y[2] z[2]| = x[0]*y[1]*z[2]+y[0]*z[1]*x[2]+z[0]*x[1]*y[2]-x[0]*z[1]*y[2]-y[0]*x[1]*z[2]-z[0]*y[1]*x[2].
*/
#include<iostream>
#include<cstdio>
using namespace std;
typedef long long ll;
const int maxn=4;
int a[maxn],b[maxn],c[maxn];
int x[maxn],y[maxn],z[maxn];
int main(){
int t;
scanf("%d",&t);
while(t--){
for(int i=0;i<4;i++){
scanf("%d%d%d",&a[i],&b[i],&c[i]);
if(i>0){
x[i-1]=a[i]-a[i-1];
y[i-1]=b[i]-b[i-1];
z[i-1]=c[i]-c[i-1];
}
}
ll det=x[0]*y[1]*z[2]+y[0]*z[1]*x[2]+z[0]*x[1]*y[2]-x[0]*z[1]*y[2]-y[0]*x[1]*z[2]-z[0]*y[1]*x[2];
if(det==0) puts("Yes");
else puts("No");
}
return 0;
}
参考: 1265 四点共面(计算几何)