高斯消元

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("
");
    }
  
 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();    
      }
View Code
原文地址:https://www.cnblogs.com/williamchenwl/p/3704997.html