ZOJ Monthly, September 2012 BiliBili
题意:在一个11维空间里,已知12个点的坐标和这12个点到第13个点的距离,求第13个点的坐标。
思路:
先设第13个点的坐标为(a1,a2,,,,,a11)
利用已知可以得出12个11元2次方程。
把12个方程都展开成a1^2+a2^2+........a11^2=......
然后用第一个方程分别和另外的11个等价,便可得到11个11元1次方程。
这样剩下就是解方程组了。

#include<stdio.h> #include<string.h> #include<math.h> #define MAXN 15 #define eps 1e-13 double mat[MAXN][MAXN],C[MAXN]; double a[MAXN][MAXN],b[MAXN]; int gauss_cpivot(int n,double a[][MAXN],double b[]) { int i,j,k,row,col,idx[MAXN]; double maxp,t; for(i=0;i<n;++i)idx[i]=i; for(k=0;k<n;++k){ for(maxp=0,i=k;i<n;++i) for(j=k;j<n;++j) if(fabs(a[i][j])>fabs(maxp)) maxp=a[row=i][col=j]; if(fabs(maxp)<eps)return 0; if(col!=k){ for(i=0;i<n;++i) t=a[i][col],a[i][col]=a[i][k],a[i][k]=t; j=idx[col],idx[col]=idx[k],idx[k]=j; } if(row!=k){ for(j=k;j<n;++j) t=a[k][j],a[k][j]=a[row][j],a[row][j]=t; t=b[k],b[k]=b[row],b[row]=t; } for(j=k+1;j<n;++j){ a[k][j]/=maxp; for(i=k+1;i<n;++i) a[i][j]-=a[i][k]*a[k][j]; } b[k]/=maxp; for(i=k+1;i<n;++i) b[i]-=b[k]*a[i][k]; } for(i=n-1;i>=0;--i) for(j=i+1;j<n;++j) b[i]-=a[i][j]*b[j]; for(k=0;k<n;++k) a[0][idx[k]]=b[k]; for(k=0;k<n;++k) b[k]=a[0][k]; return 1; } int main() { int T, i, j; double temp, sum; scanf("%d", &T); while(T--){ for(i=0; i < 12; i ++){ sum = 0; for(j = 0; j < 11; j++){ scanf("%lf",&temp); mat[i][j]=2.0*temp; sum += pow(temp,2); } scanf("%lf",&temp); C[i]=pow(temp,2)-sum; } for(i = 1 ; i < 12; i ++){ for(j = 0; j < 11; j ++) a[i - 1][j] = mat[0][j] - mat[i][j]; b[i - 1] = C[i] - C[0]; } gauss_cpivot(11,a,b); printf("%0.2lf",b[0]); for(i = 1; i < 11; i++) printf(" %0.2lf",b[i]); printf("\n"); } return 0; }