分析:设圆心为(x1,x2,……,xn),半径为R,则每个点到圆心的o的距离为R,这样解一个方程组就可以得到圆心坐标了,但这个方程是多元2次方程,我们可以设法将其转化为多元1次方程,这样我们就可以利用高斯消元法求解了,下面是转化过程:
剩下的就是套一个高斯消元模板了,下面是代码:
#include<cstdio>
#include<cstring>
#include<algorithm>
#include<iostream>
#include<queue>
#include<cmath>
using namespace std;
const int N=20;
double a[N][N],b[N],c[N][N];
int main()
{
int n;
cin>>n;
for(int i=1;i<=n+1;i++)
for(int j=1;j<=n;j++)
scanf("%lf",&c[i][j]);
for(int i=2;i<=n+1;i++)
{
for(int j=1;j<=n;j++)
{
a[i-1][j]=2*(c[i][j]-c[1][j]);
b[i-1]+=c[i][j]*c[i][j]-c[1][j]*c[1][j];
}
}
for(int i=1;i<=n;i++)
{
for(int j=i;j<=n;j++)
{
if(fabs(a[j][i])>1e-8)
{
for(int k=1;k<=n;k++)
swap(a[i][k],a[j][k]);
swap(b[i],b[j]);
break;
}
}
for(int j=1;j<=n;j++)
{
if(i==j) continue;
if(fabs(a[j][i])>1e-8)
{
double m=a[j][i]/a[i][i];
for(int k=i;k<=n;k++)
a[j][k]-=m*a[i][k];
b[j]-=m*b[i];
}
}
}
for(int i=1;i<n;i++)
printf("%.3lf ",b[i]/a[i][i]);
printf("%.3lf ",b[n]/a[n][n]);
return 0;
}