问题来源:51nod https://www.51nod.com/onlineJudge/questionCode.html#!problemId=1265
涉及一些线性代数的知识。
如果四点共面,利用这4个点产生3个向量,只要这3个向量包含全部4个点,则这3个向量共面,意味着这3个向量线性相关,那么这3个向量构成的3*3的矩阵
A
秩亏缺,即
所以只需检查矩阵的行列式是否为0,即可判断四个点是否共面。
#include <iostream>
#define FOR(i, a, b) for(int i=a; i<b; ++i)
using namespace std;
int main()
{
int T;
int a[4][3];
int vec[3][3];
cin>>T; //T次实验
while(T--){
FOR(i, 0, 4){
FOR(j, 0, 3){
cin>>a[i][j];
}
}
//得到三个向量,构成矩阵
FOR(i, 0, 3){
FOR(j, 0, 3){
vec[i][j] = a[1+i][j] - a[0][j];
}
}
//计算矩阵行列式
int det = 0;
FOR(i, 0, 3){
int tmp = 1;
FOR(j, 0, 3){
tmp *= vec[j][(j+i)%3];
}
det += tmp;
}
FOR(i, 0, 3){
int tmp = 1;
FOR(j, 0, 3){
tmp *= vec[j][(2-j+i)%3];
}
det -= tmp;
}
if (det)
cout<<"No"<<endl;
else
cout<<"Yes"<<endl;
}
return 0;
}