2011-0100

从 Trac 迁移的文章

这是从旧校内 Wiki 迁移的文章,可能存在一些样式问题,您可以向 memset0 反馈。

原文章内容如下:

这道题大意是这样:在一个11维空间中,有一个点P,给出11个点和它们到P的距离,求点P。
直接整理方程然后做高斯消元就可以了。
#include <cstdio>

const double eps=1e-6;
int test;
double x[13][13],a[13][13];
double s[13],y[12];

void swap(double &x,double &y)
{
    double o=x;
    x=y;y=o;
    return;
}

bool zero(double x)
{
    if((x<=eps)&&(x>=-eps)) return true;
    else return false;
}

void print(int o)
{
for(int i=o;i<=11;i++)
    {
        for(int j=o;j<=11;j++) printf("%.3lf ",x[i][j]);
        printf("%.3lf\n",x[i][12]);
    }
}
void jie(int k)
{
    //print(k);////////////////
    //printf("%d %.2lf\n",k,x[k][k]);////////////
    if(k==11)
    {
        y[11]=x[11][12]/x[11][11];
        return;
    }
    if(zero(x[k][k]))
    {
        int o=k;
        while(zero(x[o][k]==0)) o++;
        for(int i=k;i<=12;i++) swap(x[i][k],x[k][i]);
    }
    double p;
    for(int i=k+1;i<=11;i++)
    {
        p=x[i][k]/x[k][k];
        for(int j=k+1;j<=12;j++)
        x[i][j]=x[i][j]-p*x[k][j];
    }
    //print(k);//////////
    jie(k+1);
    p=x[k][12];
    for(int i=k+1;i<=11;i++) p=p-x[k][i]*y[i];
    y[k]=p/x[k][k];
    return;
}

int main()
{
    scanf("%d",&test);
    for(;test;test--)
    {
        for(int i=1;i<=12;i++)
        {
            for(int j=1;j<=11;j++) scanf("%lf",&x[i][j]);
            scanf("%lf",&s[i]);
        }
        for(int i=1;i<=12;i++)
        {
            s[i]=s[i]*s[i];
            for(int j=1;j<=11;j++)
            {
                s[i]=s[i]-x[i][j]*x[i][j];
                x[i][j]=2*x[i][j];
            }
            x[i][12]=-s[i];
        }
        for(int i=1;i<=11;i++)
        for(int j=1;j<=12;j++) x[i][j]=x[i][j]-x[12][j];
        jie(1);
        for(int i=1;i<=10;i++) printf("%.2lf ",y[i]);
        printf("%.2lf\n",y[11]);
    }
}
 by hzwlzrj

这道题大意是这样:在一个11维空间中,有一个点P,给出11个点和它们到P的距离,求点P。

直接整理方程然后做高斯消元就可以了。

#include

const double eps=1e-6;

int test;

double x[13][13],a[13][13];

double s[13],y[12];

void swap(double &x,double &y)

{

double o=x;

x=y;y=o;

return;

}

bool zero(double x)

{

if((x<=eps)&&(x>=-eps)) return true;

else return false;

}

void print(int o)

{

for(int i=o;i<=11;i++)

{

for(int j=o;j<=11;j++) printf("%.3lf ",x[i][j]);

printf("%.3lf\n",x[i][12]);

}

}

void jie(int k)

{

//print(k);////////////////

//printf("%d %.2lf\n",k,x[k][k]);////////////

if(k==11)

{

y[11]=x[11][12]/x[11][11];

return;

}

if(zero(x[k][k]))

{

int o=k;

while(zero(x[o][k]==0)) o++;

for(int i=k;i<=12;i++) swap(x[i][k],x[k][i]);

}

double p;

for(int i=k+1;i<=11;i++)

{

p=x[i][k]/x[k][k];

for(int j=k+1;j<=12;j++)

x[i][j]=x[i][j]-p*x[k][j];

}

//print(k);//////////

jie(k+1);

p=x[k][12];

for(int i=k+1;i<=11;i++) p=p-x[k][i]*y[i];

y[k]=p/x[k][k];

return;

}

int main()

{

scanf("%d",&test);

for(;test;test--)

{

for(int i=1;i<=12;i++)

{

for(int j=1;j<=11;j++) scanf("%lf",&x[i][j]);

scanf("%lf",&s[i]);

}

for(int i=1;i<=12;i++)

{

s[i]=s[i]*s[i];

for(int j=1;j<=11;j++)

{

s[i]=s[i]-x[i][j]*x[i][j];

x[i][j]=2*x[i][j];

}

x[i][12]=-s[i];

}

for(int i=1;i<=11;i++)

for(int j=1;j<=12;j++) x[i][j]=x[i][j]-x[12][j];

jie(1);

for(int i=1;i<=10;i++) printf("%.2lf ",y[i]);

printf("%.2lf\n",y[11]);

}

}

by hzwlzrj