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]);
}