1. 程式人生 > >BZOJ 1013[JSOI2008]球形空間產生器sphere

BZOJ 1013[JSOI2008]球形空間產生器sphere

高斯消元 none pac 幾何 color zoj swap spl display

我(不會計算幾何):這是不是計算幾何呀(絕望臉)。

LLJ大佬(瞟了一眼):這是高斯消元呀。

高斯消元。

技術分享
#include<cstdio>
#include<cstring>
#include<iostream>
#include<algorithm>
#include<cmath>
#include<queue>
#include<vector>
typedef long long LL;
using namespace std;
const int maxn=15;
int n;
double x[maxn][maxn],f[maxn][maxn];
void solve() { for(int i=1;i<=n;i++) { int now=i; for(int j=i;j<=n;j++) if(f[j][i]>f[now][i]) now=j; if(now!=i) { for(int j=i;j<=n+1;j++) swap(f[now][j],f[i][j]); now=i; } if(!f[i][i]) return
; for(int j=i+1;j<=n+1;j++) f[i][j]/=f[i][i]; f[i][i]=1; for(int j=i+1;j<=n;j++) { for(int k=i+1;k<=n+1;k++) f[j][k]-=f[i][k]*f[j][i]; f[j][i]=0; } } for(int i=n;i>=1;i--) for(int j=i+1;j<=n;j++) f[i][n
+1]-=f[i][j]*f[j][n+1]; } int main() { //freopen(".in","r",stdin); //freopen(".out","w",stdout); scanf("%d",&n); for(int i=1;i<=n+1;i++) for(int j=1;j<=n;j++) scanf("%lf",&x[i][j]); for(int i=1;i<=n;i++) for(int j=1;j<=n;j++) { f[i][j]=2*(x[i][j]-x[i+1][j]); f[i][n+1]+=(x[i][j]*x[i][j]-x[i+1][j]*x[i+1][j]); } solve(); for(int i=1;i<n;i++) printf("%.3lf ",f[i][n+1]); printf("%.3lf\n",f[n][n+1]); return 0; }
View Code

BZOJ 1013[JSOI2008]球形空間產生器sphere