球形空间产生器

题目链接

题意:给出求在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]);
 } 
原文地址:https://www.cnblogs.com/2462478392Lee/p/11311941.html