题目:
题目链接:球形空间产生器
题解:
一道很纯的数学题,,
高斯消元+公式展开
把题目说明中的公式进行展开,就是在题目中给出的矩阵中每一个点与球心的距离相等,这就能列出来一个式子,所有的距离相等,在进行相减,排列出来就是一个线性方程组,然后进行高斯消元即可。
代码:
#include<bits/stdc++.h>
#define D double
//#define inf 1e-14
using namespace std;
const int sea=12;
inline int read()
{
int s=0,w=1; char ch=getchar();
while(ch<'0'||ch>'9'){if(ch=='-')w=-1; ch=getchar();}
while(ch<='9'&&ch>='0') s=s*10+ch-'0',ch=getchar();
return s*w;
}
int n,p;
D a[sea][sea],f[sea][sea];
int main()
{
//读入
n=read();
for(int i=1;i<=n+1;i++) for(int j=1;j<=n;j++) scanf("%lf",&a[i][j]);
//构造矩阵
for(int i=1;i<=n;i++) for(int j=1;j<=n;j++)
{
f[i][j]=2*(a[i][j]-a[i+1][j]);
f[i][n+1]+=(a[i][j]*a[i][j]-a[i+1][j]*a[i+1][j]);
}
//高斯消元
for(int i=1;i<=n;i++)
{
p=i;
for(int j=i+1;j<=n;j++) if(fabs(f[j][i])>fabs(f[p][i])) p=j;
if(p!=i) for(int j=i;j<=n+1;j++) swap(f[i][j],f[p][j]);
for(int j=i+1;j<=n;j++)
{
D ins=f[j][i]/f[i][i];
for(int k=i;k<=n+1;k++) f[j][k]-=f[i][k]*ins;
}
}
for(int i=n;i>=1;i--)
{
for(int j=i+1;j<=n;j++) f[i][n+1]-=f[i][j]*f[j][n+1];// if(abs(a[i][i])<=inf && abs(a[i][n+1])>inf) {puts("-1"); return 0;}
f[i][n+1]/=f[i][i];
}
//输出
for(int i=1;i<=n;i++) printf("%.3lf ",f[i][n+1]);
return 0;
}