现在的位置: 首页 > 综合 > 正文

1013: [JSOI2008]球形空间产生器sphere (高斯消元)

2018年04月25日 ⁄ 综合 ⁄ 共 975字 ⁄ 字号 评论关闭
#include<iostream>
#include<cstdio>
#include<cstring>
#include<cmath>
#define eps 1e-6
using namespace std;
int n;
double f[21],a[21][21];
double sqr(double x){return x*x;}
void ini()
{
    scanf("%d",&n); 
    for(int i=1;i<=n;i++)scanf("%lf",&f[i]);
    for(int i=1;i<=n;i++)
       for(int j=1;j<=n;j++)
       {
           double t;
           scanf("%lf",&t);
           a[i][j]=2*(t-f[j]);
           a[i][n+1]+=sqr(t)-sqr(f[j]); 
       }
}
bool gauss()
{
     int now=1,to;double t;
     for(int i=1;i<=n;i++)
     {
         for(to=now;to<=n;to++)if(fabs(a[to][i])>eps)break;
         if(to>n)continue;
         if(to!=now)for(int j=1;j<=n+1;j++)
            swap(a[to][j],a[now][j]);
         t=a[now][i];
         for(int j=1;j<=n+1;j++)a[now][j]/=t;
         for(int j=1;j<=n;j++)
             if(j!=now)
             {
             t=a[j][i];
             for(int k=1;k<=n+1;k++)
                a[j][k]-=t*a[now][k];
         		}
         now++;
     }
     for(int i=now;i<=n;i++)
        if(fabs(a[i][n+1])>eps)return 0;
     return 1;
}
int main()
{
    ini();
    gauss();
   	for(int i=1;i<=n-1;i++)
        printf("%.3lf ",a[i][n+1]);
	printf("%.3lf\n",a[n][n+1]);
    return 0;
}

先从二维进行考虑

设圆心(x,y),给定的点(a,b)

(a,b)到圆心的距离为

(a-x)^2+(b-y)^2

=a^2+2ax+x^2+b^2+2by+y^2

于是我们可以用一个点将其它两个点变为俩个方程

例如还有一个点(a1,b1)

则2(a1-a)x+2(b1-b)y=a1^2-a^2+b1^2-b^2

然后解方程

抱歉!评论已关闭.