题目链接:http://www.51nod.com/Challenge/Problem.html#!#problemId=1265
以其中某一点向其它三点连向量,若四点共面,这三个向量定义的平行六面体的体积为零。
而这个体积等于这三个向量的混合积,所以只要验证混合积是否为零。
|ax ay az|
而混合积(a,b,c)=(a×b)·c= |bx by bz|
|cx cy cz|
证明也不难:https://baike.baidu.com/item/%E6%B7%B7%E5%90%88%E7%A7%AF/10564182?fr=kg_general
所以只需验证ax*by*cz+ay*bz*cx+bx*cy*az-az*by*cx-ay*bx*cz-ax*bz*cy的值即可。
再提一句:空间向量a、b的叉积:a×b=(ax,ay,az)×(bx,by,bz)=(ay*bz-az*by , az*bx-ax*bz , ax*by-ay*bx)
1 #include<cstdio> 2 using namespace std; 3 struct Point{ int x,y,z; }p[3]; 4 int main(){ 5 int t; 6 int x,y,z; 7 int ax,ay,az,bx,by,bz,cx,cy,cz; 8 scanf("%d", &t); 9 for(int k = 1; k <= t; ++k){ 10 scanf("%d%d%d",&x,&y,&z);//第一个点坐标 11 for(int i = 0; i < 3; ++i)//后三个点坐标 12 scanf("%d%d%d",&p[i].x,&p[i].y,&p[i].z); 13 ///构建向量 14 ax=p[0].x-x; ay=p[0].y-y; az=p[0].z-z; 15 bx=p[1].x-x; by=p[1].y-y; bz=p[1].z-z; 16 cx=p[2].x-x; cy=p[2].y-y; cz=p[2].z-z; 17 ///混合积 18 if(ax*by*cz+ay*bz*cx+bx*cy*az-az*by*cx-ay*bx*cz-ax*bz*cy == 0) 19 puts("Yes"); 20 else puts("No"); 21 } 22 return 0; 23 }