【高斯消元】[JSOI2008][HYSBZ/BZOJ1013]球形空间产生器sphere
题目链接
分析
n维空间的坐标由n个值确定。
我们设球心为
我们可以据此列出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();
}