【BZOJ 1013】【JSOI 2008】球形空间产生器sphere

高斯消元裸题,设球的一般方程为a^2+b^2+c^2+...+z^2+Aa+Bb+Cc+...+Zz=常数,求解即可code:

球心坐标为(A/-2,B/-2,C/-2,...,Z/-2)

#include<iostream>
#include<cstring>
#include<cstdio>
#include<algorithm>
using namespace std;
double a[15][15],b[15],x[15];
int n;
int main()
{
	int i,j,k;
	double xi,bz;
	scanf("%d",&n);
	for (i=1;i<=n+1;++i)
	  for (j=1;j<=n;++j)
	    {
	      scanf("%lf",&xi);
		  a[i][j]=xi;
		  a[i][n+1]=1;
		  b[i]-=xi*xi;  
	    }
	for (k=1;k<=n+1;++k)
	  {
	    if (a[k][k]==0)
	      {
	        for (j=k+1;j<=n+1;++j)
	          if (a[j][k]!=0)
	            {
	              for (i=1;i<=n+1;++i)
	                swap(a[j][i],a[k][i]);
	              swap(b[j],b[k]);
	              break;
	            }
	      }
	    for (j=k+1;j<=n+1;++j)
	      {
	        bz=a[j][k]/a[k][k];
	        for (i=1;i<=n+1;++i)
	          a[j][i]-=a[k][i]*bz;
	        b[j]-=b[k]*bz;
	      }
	  }
	for (k=n+1;k>=1;--k)
	  {
	    x[k]=b[k]/a[k][k];
	    for (j=k-1;j>=1;--j)
	      {
	        b[j]-=x[k]*a[j][k];
	        a[j][k]=0;
	      }
	  }
	for (i=1;i<=n-1;++i)
	  {
	    xi=-x[i]/2;
	    printf("%.3f ",xi);
	  }
	xi=-x[n]/2;
	printf("%.3f\n",xi);
}

你可能感兴趣的:(【BZOJ 1013】【JSOI 2008】球形空间产生器sphere)