[BZOJ1013][JSOI2008]球形空间产生器

话说最早听说的算法之一是高斯消元法,三十多年了。

#include<iostream>
#include<cstdio>
#include<cmath>
using namespace std;

int n;
double x[11][11],y[11][11];

int main(){
	int i,j,k;
	scanf("%d",&n);
	for(i=0;i<=n;i++){
		for(j=1;j<=n;j++) scanf("%lf",x[i]+j);
		if(i>0){
			y[i][0]=0;
			for(j=1;j<=n;j++){
				y[i][j]=(x[i][j]-x[0][j])*2;
				y[i][0]+=x[i][j]*x[i][j]-x[0][j]*x[0][j];
			}
		}
	}
	for(i=1;i<=n;i++){
		int s1=i;
		for(j=i+1;j<=n;j++) if(abs(y[j][i])>abs(y[s1][i])) s1=j;
		for(j=0;j<=n;j++) {
			double t1=y[i][j]; y[i][j]=y[s1][j]; y[s1][j]=t1;
		}
		double w=y[i][i];
		for(j=0;j<=n;j++) y[i][j]/=w;
		for(j=1;j<=n;j++) if(j!=i&&y[j][i]!=0) {
			w=y[j][i];
			for(k=0;k<=n;k++) y[j][k]=y[j][k]-w*y[i][k];
		}
	}
	for(i=1;i<=n;i++){
		printf("%.3lf",y[i][0]);
		if(i<n) printf(" ");
		else printf("\n");
	}
	return 0;
}

 

posted @ 2016-01-05 17:49  海豚爸爸  阅读(224)  评论(0编辑  收藏  举报