高斯消元
简单起见,假设是二维,圆心(x,y),对于任意两个方程
(a1−x)2+(b1−y)2=r2
(a2−x)2+(b2−y)2=r2
直接解起来是很费劲的,还会引入r这个新未知数,
于是两式相减
(−2a1+2a2)x+(−2b1+2b2)y=a22−a21+b22−b21
总能得到n个一次未知数,n个方程,高斯消元即可
#include<cstdio>
#define N 12
using namespace std;
double a[N][N], f[N][N];
int n;
void Gauss()
{
for(int i = 1; i <= n; i++)
for(int j = i+1; j <= n; j++)
{
double x = f[j][i]/f[i][i];
for(int k = i; k <= n+1; k++)
f[j][k]-=x*f[i][k];
}
for(int i = 1; i <= n; i++)
for(int j = n+1; j >= i; j--)
f[i][j]/=f[i][i];
for(int i = n; i >= 1; i--)
{
double x = f[i][n+1];
for(int j = i-1; j; j--)
{
f[j][n+1]-=f[j][i]*x;
f[j][i]=0;
}
}
}
int main()
{
scanf("%d",&n);
for(int i = 0; i <= n; 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[0][j]+2*a[i][j];
f[i][n+1]-=a[0][j]*a[0][j]-a[i][j]*a[i][j];
}
}
Gauss();
for(int i = 1; i <= n; i++)
{
printf("%.3f",f[i][n+1]);
if(i!=n)printf(" ");
}
return 0;
}