这个题是个公式推导题。已知四面体的六条边,求四面体体积。
在计算几何的模板中发现欧拉公式,可以计算任意四面体的体积,知道3个点坐标和3个COS值即可。而题目是知道6条边,所以需要进行推导转化,通过线性代数知识变成行列式
(注意输入顺序是AB,AC,AD,BC,BD,CD,这一点挖了十次左右。。另外,推导过程中的matix[2][0]发生了错误,应为:(p^2+r^2-m^2)/2,这一点上WA了5次):
AC代码,HDU上有一道完全一样的题,买一送一。线性代数很重要啊!!!
#include <iostream> #include <cmath> #include <stdio.h> #include <stdlib.h> #include <iomanip> using namespace std; double matix[3][3]; double calmatix() { return (matix[0][0]*matix[1][1]*matix[2][2]) +(matix[0][1]*matix[1][2]*matix[2][0]) +(matix[0][2]*matix[1][0]*matix[2][1]) -(matix[0][2]*matix[1][1]*matix[2][0]) -(matix[0][1]*matix[1][0]*matix[2][2]) -(matix[0][0]*matix[1][2]*matix[2][1]); } void changenum(double l,double m,double n,double p,double q,double r) { matix[0][0]=p*p; matix[0][1]=(p*p+q*q-n*n)/2.0; matix[0][2]=(p*p+r*r-m*m)/2.0; matix[1][0]=(p*p+q*q-n*n)/2.0; matix[1][1]=q*q; matix[1][2]=(q*q+r*r-l*l)/2.0; matix[2][0]=(p*p+r*r-m*m)/2.0; matix[2][1]=(q*q+r*r-l*l)/2.0; matix[2][2]=r*r; } int main() { double p,q,r,l,m,n; while(cin>>n>>m>>p>>l>>q>>r) { changenum(l,m,n,p,q,r); //狗日的顺序太恶心了!! double result; double temp=calmatix(); if(temp<0) { temp=abs(temp); } temp=sqrt(temp); result=temp/6.0; cout<<setiosflags(ios::fixed)<<setprecision(4)<<result<<endl; } return 0; }最后附录尸体一张…………………………虽百WA其犹未悔……ORZ