题目链接:51nod 1265 四点共面
四个点构成的三个向量a,b,c共面的充要条件是存在不全为零的实数x,y,z满足x*a+y*b+z*c=0,然后想到线代了..
其实就是三个向量的混合积为0:(a,b,c)=(a×b)·c=
|ax ay az|
|bx by bz| = ax*by*cz+ay*bz*cx+bx*cy*az-az*by*cx-ay*bx*cz-ax*bz*cy = 0;
|cx cy cz|
看到行列式我就想到线性代数快考试了,然而我还没预习~~~(>_<)~~~
1 #include<cstdio> 2 #include<cstring> 3 #include<algorithm> 4 using namespace std; 5 struct Point{ 6 int x,y,z; 7 }p[3]; 8 int main(){ 9 int t, i, k; 10 int x,y,z; 11 int ax,ay,az,bx,by,bz,cx,cy,cz; 12 scanf("%d", &t); 13 for(k = 1; k <= t; ++k){ 14 scanf("%d%d%d",&x,&y,&z); 15 for(i = 0; i < 3; ++i) 16 scanf("%d%d%d",&p[i].x,&p[i].y,&p[i].z); 17 ax=p[0].x-x; ay=p[0].y-y; az=p[0].z-z; 18 bx=p[1].x-x; by=p[1].y-y; bz=p[1].z-z; 19 cx=p[2].x-x; cy=p[2].y-y; cz=p[2].z-z; 20 if(ax*by*cz+ay*bz*cx+bx*cy*az-az*by*cx-ay*bx*cz-ax*bz*cy == 0) 21 puts("Yes"); 22 else puts("No"); 23 } 24 return 0; 25 }