基准时间限制:1 秒 空间限制:131072 KB 分值: 0 难度:基础题
收藏
关注
给出三维空间上的四个点(点与点的位置均不相同),判断这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
李陶冶 (题目提供者)
#include<iostream> #include<algorithm> #include<stdio.h> #include<string.h> #include<stdlib.h> #include<math.h> #define eps 1e-8 #define zero(x) (((x)>0?(x):-(x))<eps) using namespace std; struct point3{ double x,y,z; }; struct line3{ point3 a,b; }; struct plane3{ point3 a,b,c; }; point3 xmult(point3 u,point3 v){ point3 ret; ret.x = u.y*v.z - v.y*u.z; ret.y = u.z*v.x - u.x*v.z; ret.z = u.x*v.y - u.y*v.x; return ret; } point3 subt(point3 u,point3 v){ point3 ret; ret.x = u.x - v.x; ret.y = u.y - v.y; ret.z = u.z - v.z; return ret; } point3 pvec(point3 a,point3 b,point3 c){ return xmult(subt(a,b),subt(b,c)); } double dmult(point3 u,point3 v){ return u.x*v.x + u.y*v.y + u.z*v.z; } int dots_onplane(point3 a,point3 b,point3 c,point3 d){ return zero(dmult(pvec(a,b,c),subt(d,a))); } int main(){ point3 a[4]; int T; scanf("%d",&T); while(T--){ for(int i=0;i<4;i++){ scanf("%lf%lf%lf",&a[i].x,&a[i].y,&a[i].z); } int flag = dots_onplane(a[0],a[1],a[2],a[3]); if(flag == 1){ printf("Yes\n"); }else{ printf("No\n"); } } return 0; }
版权声明:本文为博主原创文章,如有特殊需要请与博主联系 QQ : 793977586。
时间: 2024-10-10 15:00:13