Description
有一个球形空间产生器能够在n维空间中产生一个坚硬的球体。现在,你被困在了这个n维球体中,你只知道球
面上n+1个点的坐标,你需要以最快的速度确定这个n维球体的球心坐标,以便于摧毁这个球形空间产生器。Input
第一行是一个整数n(1<=N=10)。接下来的n+1行,每行有n个实数,表示球面上一点的n维坐标。每一个实数精确到小数点
后6位,且其绝对值都不超过20000。Output
有且只有一行,依次给出球心的n维坐标(n个实数),两个实数之间用一个空格隔开。每个实数精确到小数点
后3位。数据保证有解。你的答案必须和标准输出一模一样才能够得分。Sample Input
2 0.0 0.0 -1.0 1.0 1.0 0.0
Sample Output
0.500 1.500
HINT
Solution
Code
1 #include2 #include 3 #include 4 #include 5 #define N (101) 6 using namespace std; 7 8 double p[N][N],f[N][N],ans[N]; 9 int n;10 11 void Gauss()12 {13 for (int i=1; i<=n; ++i)14 {15 int num=i;16 for (int j=i+1; j<=n; ++j)17 if (fabs(f[j][i])>fabs(f[num][i])) num=j;18 if (num!=i) swap(f[i],f[num]);19 for (int j=i+1; j<=n; ++j)20 {21 double t=f[j][i]/f[i][i];22 for (int k=i; k<=n+1; ++k)23 f[j][k]-=t*f[i][k];24 }25 }26 for (int i=n; i>=1; --i)27 {28 for (int j=i+1; j<=n; ++j)29 f[i][n+1]-=f[i][j]*ans[j];30 ans[i]=f[i][n+1]/f[i][i];31 }32 }33 34 int main()35 {36 scanf("%d",&n);37 for (int i=1; i<=n+1; ++i)38 for (int j=1; j<=n; ++j)39 scanf("%lf",&p[i][j]);40 for (int i=1; i<=n; ++i)41 for (int j=1; j<=n; ++j)42 {43 f[i][n+1]+=p[i][j]*p[i][j]-p[i+1][j]*p[i+1][j];44 f[i][j]=2*(p[i][j]-p[i+1][j]);45 }46 Gauss();47 for (int i=1; i<=n-1; ++i)48 printf("%.3lf ",ans[i]);49 printf("%.3lf\n",ans[n]);50 }