BZOJ 1013 球形空间产生器sphere 高斯消元

来源:互联网 发布:淘宝新店怎么开直通车 编辑:程序博客网 时间:2024/04/29 19:43
题意:n维空间,给出n+1个点的坐标 求出圆心坐标.n<=10.

根据两点距离列出n+1个方程,两个方程相减,消去未知半径和平方项后,

剩下n个方程n个未知数,高斯消元即可.

#include <bits/stdc++.h>using namespace std;typedef long long ll;const double eps=1e-6;const int N=3e2+20;int n;double f[N],a[N][N];void init(){for(int i=1;i<=n;i++)scanf("%lf",&f[i]);double x;for(int i=1;i<=n;i++){for(int j=1;j<=n;j++){scanf("%lf",&x);a[i][j]=2.0*(x-f[j]);a[i][n+1]+=x*x-f[j]*f[j]; }}}bool gauss(){int i,j,now=1;double t;for(i=1;i<=n;i++)//col{for(j=now;j<=n;j++)if(fabs(a[j][i])>eps) break;if(j>n)continue;if(j!=now)for(int k=1;k<=n+1;k++)swap(a[j][k],a[now][k]);t=a[now][i];for(int k=1;k<=n+1;k++)a[now][k]/=t;//a[now][i]=1;for(int k=1;k<=n;k++){if(k!=now){t=a[k][i];//for(int l=1;l<=n+1;l++)a[k][l]-=t*a[now][l];}}now++;}for(i=now;i<=n;i++)if(fabs(a[i][n+1])>eps)return 0;return 1;}int main(){while(cin>>n){init();int k=gauss();for(int i=1;i<=n;i++)printf("%.3lf%c",a[i][n+1],i==n?'\n':' ');}return 0;}




原创粉丝点击