题目:
题目链接:球形空间产生器
题解:
一道很纯的数学题,,
高斯消元+公式展开
把题目说明中的公式进行展开,就是在题目中给出的矩阵中每一个点与球心的距离相等,这就能列出来一个式子,所有的距离相等,在进行相减,排列出来就是一个线性方程组,然后进行高斯消元即可。
代码:
#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;
}