题意:n维空间,给出n+1个点的坐标 求出圆心坐标.n<=10.
根据两点距离列出n+1个方程,两个方程相减,消去未知半径和平方项后,
根据两点距离列出n+1个方程,两个方程相减,消去未知半径和平方项后,
剩下n个方程n个未知数,高斯消元即可.
#include <bits/stdc++.h>
using namespace std;
typedef long long ll;
const double eps=1e-6;
const int N=3e2+20;
int n;
double f[N],a[N][N];
void init()
{
for(int i=1;i<=n;i++)
scanf("%lf",&f[i]);
double x;
for(int i=1;i<=n;i++)
{
for(int j=1;j<=n;j++)
{
scanf("%lf",&x);
a[i][j]=2.0*(x-f[j]);
a[i][n+1]+=x*x-f[j]*f[j];
}
}
}
bool gauss()
{
int i,j,now=1;
double t;
for(i=1;i<=n;i++)//col
{
for(j=now;j<=n;j++)
if(fabs(a[j][i])>eps) break;
if(j>n) continue;
if(j!=now)
for(int k=1;k<=n+1;k++)
swap(a[j][k],a[now][k]);
t=a[now][i];
for(int k=1;k<=n+1;k++)
a[now][k]/=t;
//a[now][i]=1;
for(int k=1;k<=n;k++)
{
if(k!=now)
{
t=a[k][i];//
for(int l=1;l<=n+1;l++)
a[k][l]-=t*a[now][l];
}
}
now++;
}
for(i=now;i<=n;i++)
if(fabs(a[i][n+1])>eps) return 0;
return 1;
}
int main()
{
while(cin>>n)
{
init();
int k=gauss();
for(int i=1;i<=n;i++)
printf("%.3lf%c",a[i][n+1],i==n?'\n':' ');
}
return 0;
}