【BZOJ1013】球形空间产生器,第一次的高斯消元

来源:互联网 发布:linux虚拟机挂载光盘 编辑:程序博客网 时间:2024/03/28 18:33

Time:2016.08.18
Author:xiaoyimi
转载注明出处谢谢


传送门
思路:
板子高斯消元
根据球的方程(xa)2+(yb)2+...=r2与给出的n+1个坐标
,逐次相减后消去未知数的二次项,可以得到n个n元一次方程
具体过程大家可以自己在纸上写写
注意:无
代码:

#include<cstdio>#include<iostream>#include<cmath>using namespace std;int n;double f[12][12],P[12][12],ans[11];void gauss(){    double p;    int t;    for (int i=1;i<n;++i)    {        t=i;        for (int j=i+1;j<=n;++j)            if (fabs(f[j][i])>fabs(f[t][i])) t=j;        for (int j=i;j<=n+1;++j)            swap(f[i][j],f[t][j]);        for (int j=i+1;j<=n;++j)        {            p=f[j][i]/f[i][i];            for (int k=i+1;k<=n+1;++k)                f[j][k]-=f[i][k]*p;        }    }    for (int i=n;i;--i)    {        p=0;        for (int j=i+1;j<=n;++j) p+=f[i][j]*ans[j];        ans[i]=(f[i][n+1]-p)/f[i][i];    }}main(){    scanf("%d",&n);    for (int i=1;i<=n+1;++i)        for (int j=1;j<=n;++j)            scanf("%lf",P[i]+j);    for (int i=1;i<=n;i++)        for (int j=1;j<=n;j++)            f[i][j]=2*(P[i][j]-P[i+1][j]),            f[i][n+1]+=P[i][j]*P[i][j]-P[i+1][j]*P[i+1][j];    gauss();    for (int i=1;i<=n;i++) printf("%.3lf%c",ans[i]," \n"[i==n]);}
0 0
原创粉丝点击