您的位置:首页 > 其它

【BZOJ1013】球形空间产生器,第一次的高斯消元

2016-08-18 20:56 423 查看
Time:2016.08.18

Author:xiaoyimi

转载注明出处谢谢

传送门

思路:

板子高斯消元

根据球的方程(x−a)2+(y−b)2+...=r2与给出的n+1个坐标

,逐次相减后消去未知数的二次项,可以得到n个n元一次方程

具体过程大家可以自己在纸上写写

注意:无

代码:

#include<cstdio>
#include<iostream>
#include<cmath>
using namespace std;
int n;
double f[12][12],P[12][12],ans[11];
void gauss()
{
double p;
int t;
for (int i=1;i<n;++i)
{
t=i;
for (int j=i+1;j<=n;++j)
if (fabs(f[j][i])>fabs(f[t][i])) t=j;
for (int j=i;j<=n+1;++j)
swap(f[i][j],f[t][j]);
for (int j=i+1;j<=n;++j)
{
p=f[j][i]/f[i][i];
for (int k=i+1;k<=n+1;++k)
f[j][k]-=f[i][k]*p;
}
}
for (int i=n;i;--i)
{
p=0;
for (int j=i+1;j<=n;++j) p+=f[i][j]*ans[j];
ans[i]=(f[i][n+1]-p)/f[i][i];
}
}
main()
{
scanf("%d",&n);
for (int i=1;i<=n+1;++i)
for (int j=1;j<=n;++j)
scanf("%lf",P[i]+j);
for (int i=1;i<=n;i++)
for (int j=1;j<=n;j++)
f[i][j]=2*(P[i][j]-P[i+1][j]),
f[i][n+1]+=P[i][j]*P[i][j]-P[i+1][j]*P[i+1][j];
gauss();
for (int i=1;i<=n;i++) printf("%.3lf%c",ans[i]," \n"[i==n]);
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: