HDU 5733 tetrahedron

来源:互联网 发布:淘宝里的微淘是什么 编辑:程序博客网 时间:2024/05/16 12:45
#include <iostream>#include <math.h>using namespace std;struct Point{double x,y,z;}p[10];double s[10];double mixMul(Point a,Point b,Point c,Point d){b.x-=a.x;b.y-=a.y;b.z-=a.z;c.x-=a.x;c.y-=a.y;c.z-=a.z;d.x-=a.x;d.y-=a.y;d.z-=a.z;return fabs(b.x*c.y*d.z+c.x*d.y*b.z+d.x*b.y*c.z-d.x*c.y*b.z-d.y*c.z*b.x-d.z*c.x*b.y);}double area(Point a,Point b,Point c){b.x-=a.x;b.y-=a.y;b.z-=a.z;c.x-=a.x;c.y-=a.y;c.z-=a.z;Point d;d.x=b.y*c.z-c.y*b.z;d.y=b.z*c.x-c.z*b.x;d.z=b.x*c.y-c.x*b.y;return sqrt(d.x*d.x+d.y*d.y+d.z*d.z)/2;}int main(){while(1){for(int i=1;i<=4;i++){if(scanf("%lf %lf %lf",&p[i].x,&p[i].y,&p[i].z)==EOF){return 0;//如果结束输入就跳出程序 }}double mul=mixMul(p[1],p[2],p[3],p[4]);if(mul<1e-6){printf("%s\n","O O O O");continue;}double v=mul/6;s[1]=area(p[2],p[3],p[4]);s[2]=area(p[1],p[3],p[4]);s[3]=area(p[1],p[2],p[4]);s[4]=area(p[1],p[2],p[3]);double cirX=(s[1]*p[1].x+s[2]*p[2].x+s[3]*p[3].x+s[4]*p[4].x)/(s[1]+s[2]+s[3]+s[4]);double cirY=(s[1]*p[1].y+s[2]*p[2].y+s[3]*p[3].y+s[4]*p[4].y)/(s[1]+s[2]+s[3]+s[4]);double cirZ=(s[1]*p[1].z+s[2]*p[2].z+s[3]*p[3].z+s[4]*p[4].z)/(s[1]+s[2]+s[3]+s[4]);double r=3*v/(s[1]+s[2]+s[3]+s[4]);printf("%.4f %.4f %.4f %.4f\n",cirX,cirY,cirZ,r);}}


一道用行列式多到爆炸的题~

1.输入数据要用double!用int处理时有时候自动类型转换了 大一点的数字就会WA;(后来我听说貌似测试数据有全0 所以必须要double了!

2.用结构体可以方便输入 用循环就不用输入12个数字了 套公式时也不容易出错 但是要注意EOF时return 0而不是break 不信的话用break然后输入完Ctrl+Z试试;

3.判定没有四面体的条件可以用同一点的三个向量混合积=0(共面),混合积可以直接用来计算r;

4.一定要细心!行列式多的情况下很容易打错字母哒

0 0
原创粉丝点击