1265 四点共面
给出三维空间上的四个点(点与点的位置均不相同),判断这4个点是否在同一个平面内(4点共线也算共面)。如果共面,输出"Yes",否则输出"No"。
Input
第1行:一个数T,表示输入的测试数量(1 <= T <= 1000)
第2 - 4T + 1行:每行4行表示一组数据,每行3个数,x, y, z, 表示该点的位置坐标(-1000 <= x, y, z <= 1000)。
Output
输出共T行,如果共面输出"Yes",否则输出"No"。
Input示例
1
1 2 0
2 3 0
4 0 0
0 0 0
Output示例
Yes
//开始做几何题,有点难啊,四点,做成 3 个向量的话,必须是线性相关的,才会共面
线性相关,Xa = k1*Xb + k2*Xc ,存在一组,不全为 0 的 k1,k2,使之满足
1 #include <bits/stdc++.h> 2 using namespace std; 3 #define LL long long 4 #define MOD 1000000007 5 6 struct Point 7 { 8 int x,y,z; 9 }pt[5]; 10 11 int main() 12 { 13 int T; 14 scanf("%d",&T); 15 while (T--) 16 { 17 for (int i=1;i<=4;i++) 18 scanf("%d%d%d",&pt[i].x,&pt[i].y,&pt[i].z); 19 Point xa,xb,xc; 20 xa.x = pt[1].x-pt[2].x; xa.y = pt[1].y-pt[2].y; xa.z = pt[1].z-pt[2].z; 21 xb.x = pt[2].x-pt[3].x; xb.y = pt[2].y-pt[3].y; xb.z = pt[2].z-pt[3].z; 22 xc.x = pt[3].x-pt[4].x; xc.y = pt[3].y-pt[4].y; xc.z = pt[3].z-pt[4].z; 23 int val = xa.x*xb.y*xc.z + xa.y*xb.z*xc.x + xa.z*xb.x*xc.y; 24 val -= xa.z*xb.y*xc.x + xa.y*xb.x*xc.z + xa.x*xb.z*xc.y; 25 26 if (val) 27 printf("No\n"); 28 else 29 printf("Yes\n"); 30 } 31 return 0; 32 }