HYSBZ/BZOJ 1013 [JSOI2008] 球形空間產生器sphere - 高斯約當消元

題目描述

分析:

根據題目給出的dist的定義,並設球心的座標爲(x1,x2,...xn ),列出n+1個方程。
step 1. n+1個方程的兩邊同時平方。
step 2. n+1個方程拆括號,化簡。
step 3. 前n個方程-第n+1個方程,得到新的n個方程(dist2 )
step 4. n個關於n個未知數的方程,解吧。

#include<cstdio>
#include<cmath>
#include<algorithm>
using namespace std;
#define MAXN 10
const double eps=1e-12;

int n;
double a[MAXN+10][MAXN+10],b[MAXN+10][MAXN+10];

void read()
{
    scanf("%d",&n);
    for(int i=1;i<=n+1;i++){
        for(int j=1;j<=n;j++)
            scanf("%lf",&b[i][j]);
    }
    for(int i=1;i<=n;i++){
        a[i][n+1]=0.0;
        for(int j=1;j<=n;j++){
            a[i][j]=2.0*b[n+1][j]-2.0*b[i][j];
            a[i][n+1]+=b[n+1][j]*b[n+1][j]-b[i][j]*b[i][j];
        }
    }
}
void GJ_elimination(int equ,int var,int &row,int &col)
{
    int mx;
    for(row=col=1;row<=equ&&col<=var;row++,col++){
        mx=row;
        for(int i=row+1;i<=equ;i++)
            if(fabs(a[i][col])>fabs(a[mx][col]))
                mx=i;
        if(mx!=row)
            swap(a[mx],a[row]);
        if(fabs(a[row][col])<eps){
            row--;
            continue;
        }
        for(int i=1;i<=equ;i++){
            if(i==row||fabs(a[i][col])<eps)
                continue;
            for(int j=var+1;j>=col;j--)
                a[i][j]-=a[i][col]/a[row][col]*a[row][j];
        }
    }
}
void Gauss_Jordan(int equ,int var)
{
    int row,col;
    GJ_elimination(equ,var,row,col);
    for(int i=1;i<equ;i++)
        printf("%.3lf ",a[i][var+1]/a[i][i]);
    printf("%.3lf\n",a[equ][var+1]/a[equ][equ]);
}
int main()
{
    read();
    Gauss_Jordan(n,n);
}
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章