题目链接: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)

 #include<cstdio>
using namespace std;
struct Point{ int x,y,z; }p[];
int main(){
int t;
int x,y,z;
int ax,ay,az,bx,by,bz,cx,cy,cz;
scanf("%d", &t);
for(int k = ; k <= t; ++k){
scanf("%d%d%d",&x,&y,&z);//第一个点坐标
for(int i = ; i < ; ++i)//后三个点坐标
scanf("%d%d%d",&p[i].x,&p[i].y,&p[i].z);
///构建向量
ax=p[].x-x; ay=p[].y-y; az=p[].z-z;
bx=p[].x-x; by=p[].y-y; bz=p[].z-z;
cx=p[].x-x; cy=p[].y-y; cz=p[].z-z;
///混合积
if(ax*by*cz+ay*bz*cx+bx*cy*az-az*by*cx-ay*bx*cz-ax*bz*cy == )
puts("Yes");
else puts("No");
}
return ;
}
04-28 23:24