1013: [JSOI2008]球形空间产生器sphere

很直观的一个gauss题;

用的是以前用过的一个模板;

#include<cstdio>
#include<algorithm>
#include<cmath>
#include<cstring>
#define maxn 12
#define eps 0.00001
using namespace std;

double matrix[15][15];
double ans[15];
void exchange_col(int p1,int p2,int n)
{
    double t;
    int i;
    for(int i=0; i<=n; i++)
        swap(matrix[p1][i],matrix[p2][i]);
}

bool gauss(int n)
{
    int i,j,k;
    int p;
    double r;
    for(i=0; i<n-1; i++)
    {
        p=i;
        for(j=i+1; j<n; j++)
            if(fabs(matrix[j][i])>fabs(matrix[p][i]))
                p=j;
        if(p!=i)
            exchange_col(i,p,n);
        if(matrix[i][i]==0) return false;
        for(j=i+1; j<n; j++)
        {
            r=matrix[j][i]/matrix[i][i];
            for(k=i; k<=n; k++)
                matrix[j][k]-=r*matrix[i][k];
        }
    }
    for(i=n-1; i>=0; i--)
    {
        ans[i]=matrix[i][n];
        for(j=n-1; j>i; j--)
            ans[i]-=matrix[i][j]*ans[j];
        if(fabs(matrix[i][i])<eps)return false;
        ans[i]/=matrix[i][i];
    }
    return true;
}

double map[15][15];
double fang[15][15];

int main()
{
    int n;
    scanf("%d",&n);
    for(int i=0;i<=n;i++)
    {
        for(int j=0;j<n;j++)
        {
            scanf("%lf",&map[i][j]);
            if(i>0)
            {
                matrix[i-1][j]=2*(map[i][j]-map[i-1][j]);
                fang[i-1][j]=map[i][j]*map[i][j]-map[i-1][j]*map[i-1][j];
            }
        }
    }
    for(int i=0;i<n;i++)
    {
        double ret=0;
        for(int j=0;j<n;j++)
            ret+=fang[i][j];
        matrix[i][n]=ret;
    }
    gauss(n);
    for(int i=0;i<n-1;i++)
        printf("%.3lf ",ans[i]);
    printf("%.3lf",ans[n-1]);
    return 0;
}
View Code

 

posted @ 2013-12-04 21:27  Yours1103  阅读(215)  评论(0编辑  收藏  举报