高斯消元
BZOJ 1013 [JSOI2008]球形空间产生器sphere
终于会做这道题了,列出的方程很简单
将方程相邻相减得到关于圆心个坐标的一次方程共N个
然后高斯消元解方程即可
#include <cstdio> #include <cstring> #include <cmath> using namespace std; const int N=20; double a[N][N],c[N][N]; int n; int swap(int x,int y) { for (int i=0;i<=n;i++) { double tmp=c[x][i]; c[x][i]=c[y][i]; c[y][i]=tmp; } } int guass() { for (int i=1;i<=n;i++) for (int k=i,j=i;j<=n;j++) {if (fabs(c[j][i-1])>fabs(c[k][i-1])) k=j;//找到xi-1系数最大的一排 swap(i,k); //将i行于这一行交换 for (int j=i+1;j<=n;j++) for (int k=n;k>=i-1;k--) c[j][k]-=c[i][k]*c[j][i-1]/c[i][i-1]; //将i+1到N行的xi-1消去 } } int solve() //对得到的梯形矩阵求解 { double ans[N]; ans[n]=1; for (int i=n;i>=1;i--) { double sum=0; for (int j=i;j<=n;j++) sum-=ans[j]*c[i][j]; //获得x(i+1),x(i+2)..的和 ans[i-1]=sum/c[i][i-1]; } for (int i=0;i<n;i++) if (i) printf(" %.3lf",ans[i]); else printf("%.3lf",ans[i]); printf("\n"); } int main() { scanf("%d",&n); for (int i=0;i<=n;i++) for (int j=0;j<n;j++) scanf("%lf",&a[i][j]); for (int i=1;i<=n;i++) for (int j=0;j<n;j++) c[i][j]=2*(a[i-1][j]-a[i][j]), c[i][n]+=a[i][j]*a[i][j]-a[i-1][j]*a[i-1][j]; guass(); solve(); }