这个题是个公式推导题。已知四面体的六条边,求四面体体积。
在计算几何的模板中发现欧拉公式,可以计算任意四面体的体积,知道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
![](https://img-my.csdn.net/uploads/201211/08/1352376626_1606.jpg)