【高斯消元】[JSOI2008][HYSBZ/BZOJ1013]球形空间产生器sphere

题目链接

分析

n维空间的坐标由n个值确定。
我们设球心为M(x1,x2,,xn)dist(a,b)表示a,b两点之间的距离。

dist(M,i)=dist(M,i+1)

我们可以据此列出n个不同的化简后为一次的方程,用高斯约当消元法解出即可。

代码

#include<cstdio>
#include<cmath>
#include<algorithm>
using namespace std;
#define MAXN 10
#define EPS 1e-9
int n,equ,var;
double p[MAXN+10][MAXN+10],a[MAXN+10][MAXN+10];
void Read(int &x){
    char c;
    while(c=getchar(),c!=EOF)
        if(c>='0'&&c<='9'){
            x=c-'0';
            while(c=getchar(),c>='0'&&c<='9')
                x=x*10+c-'0';
            ungetc(c,stdin);
            return;
        }
}
void read(){
    Read(n);
    equ=var=n;
    int i,j;
    for(i=1;i<=n+1;i++)
        for(j=1;j<=n;j++)
            scanf("%lf",&p[i][j]);
    for(i=1;i<=n;i++)
        for(j=1;j<=n;j++){
            a[i][j]=2*(p[i+1][j]-p[i][j]);
            a[i][var+1]+=p[i+1][j]*p[i+1][j]-p[i][j]*p[i][j];
        }
}
void gauss_jordan(){
    int row,col,i,j,mxr;
    for(row=col=1;row<=equ&&col<=var;row++,col++){
        mxr=row;
        for(i=row+1;i<=equ;i++)
            if(fabs(a[i][col])>fabs(a[mxr][col]))
                mxr=i;
        if(mxr!=row)
            swap(a[mxr],a[row]);
        if(fabs(a[row][col])<EPS){
            row--;
            continue;
        }
        for(i=1;i<=equ;i++)
            if(i!=row&&a[i][col]!=0)
                for(j=var+1;j>=col;j--)
                    a[i][j]-=a[row][j]*a[i][col]/a[row][col];
    }
    row--;
}
void print(){
    for(int i=1;i<equ;i++)
        printf("%.3lf ",a[i][var+1]/a[i][i]);
    printf("%.3lf\n",a[n][var+1]/a[n][n]);
}
int main()
{
    read();
    gauss_jordan();
    print();
}
posted @ 2016-02-12 23:49  outer_form  阅读(186)  评论(0编辑  收藏  举报