比较裸的解线性方程组。
设球心坐标为
(x1,x2,...,xn)
,根据定义可以列出方程组:
∑k=1N(xk−aik)2=∑k=1N(xk−ajk)2
.
展开后移项相减,得到
∑k=1N2(aik−ajk)xk=a2ik−a2jk
于是变成一个n个变量的线性方程组,根据题意,这个方程组总是洽定的。
#include<cstdio>
#include<cmath>
#include<cstring>
#include<cstdlib>
#include<algorithm>
using namespace std;
const double eps=1e-6;
double a[22][22],p[22];
int n;
void init()
{
scanf("%d",&n);
for (int i=1;i<=n;i++) scanf("%lf",&p[i]);
double t;
for (int i=1;i<=n;i++)
for (int j=1;j<=n;j++)
{
scanf("%lf",&t);
a[i][j]=2*(t-p[j]);
a[i][n+1]+=t*t-p[j]*p[j];
}
}
void gauss()
{
int now=1,to;double t;
for (int i=1;i<=n;i++)
{
for (to=now;to<=n;to++) if (fabs(a[to][i])>eps) break;
if (to>n) continue;
if (to!=now)
for (int j=1;j<=n+1;j++) swap(a[to][j],a[now][j]);
t=a[now][i];
for (int j=1;j<=n+1;j++) a[now][j]/=t;
for (int j=1;j<=n;j++)
if (j!=now)
{
t=a[j][i];
for (int k=1;k<=n+1;k++) a[j][k]-=t*a[now][k];
}
now++;
}
}
int main()
{
init();
gauss();
for (int i=1;i<n;i++) printf("%.3lf ",a[i][n+1]);
printf("%.3lf\n",a[n][n+1]);
return 0;
}
总结
1:高斯消元很多就是想办法,将题目转化为线性方程组