题意:给出求在n维坐标系中,到n+1个点距离都相同的点。
思路:我们不妨设n维球心的坐标为(x1,x2,x3,...,xn),那么我们可以用第一个点和剩余的n个点建立方程得到距离相等的式子,然后高斯消元即可解出球心坐标。以三维空间为例,令读入的第一个点坐标为(a,b,c),第二个点为(a1,b1,c1),则 第一个方程为(a1-x1)^2+(b1-x2)^2+(c1-x3)^2=(a-x1)^2+(b-x2)^2+(c-x3)^2,同理可得剩下的方程,展开合并后可得2(a1-a)x1+2(b1-b)x2+2(c1-c)x3=a1^2-a^2+b1^2-b^2+c1^2-c^2。
#include<cstdio> #include<cstring> #include<algorithm> #include<queue> #include<cmath> #include<map> #include<vector> #define ll long long using namespace std; double a[20][20],b[20],c[20][20]; int n; int main() { scanf("%d",&n); for(int i=1;i<=n+1;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++) { c[i][j]=2*(a[i][j]-a[i+1][j]); b[i]+=a[i][j]*a[i][j]-a[i+1][j]*a[i+1][j]; printf("%.3lf ",c[i][j]); } printf("%.3lf ",b[i]); } for(int i=1;i<=n;i++) { for(int j=i;j<=n;j++) { if(fabs(c[j][i])>1e-8) { for(int k=1;k<=n;k++) { swap(c[i][k],c[j][k]); } swap(b[i],b[j]); } } for(int j=1;j<=n;j++) { if(i==j) continue; double rate=c[j][i]/c[i][i]; for(int k=i;k<=n;k++) c[j][k]-=c[i][k]*rate; b[j]-=b[i]*rate; } } for(int i=1;i<n;i++) printf("%.3lf ",b[i]/c[i][i]); printf("%.3lf ",b[n]/c[n][n]); }