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次方程。
这样剩下就是解方程组了。
View Code
#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;
}

 

posted on 2012-10-01 21:42  aigoruan  阅读(236)  评论(0)    收藏  举报

导航