P4035 [JSOI2008] Sphärischer Raumgenerator (Gaußsche Eliminierung)

Themenbeschreibung

Es gibt einen sphärischen Raumgenerator, der eine feste Kugel im n-dimensionalen Raum erzeugen kann. Jetzt sind Sie in dieser n-dimensionalen Kugel gefangen und kennen nur die Koordinaten von n + 1 Punkten auf der Kugel. Sie müssen die Koordinaten des Mittelpunkts dieser n-dimensionalen Kugel so schnell wie möglich bestimmen, um sie zu zerstören Dieser sphärische Raum soll ein Gerät erzeugen.

Eingabeformat

Die erste Zeile ist eine ganze Zahl (1≤N≤10). In den nächsten n+1 Zeilen hat jede Zeile n reelle Zahlen, die die n-dimensionalen Koordinaten eines Punktes auf der Kugel darstellen. Jede reelle Zahl hat eine Genauigkeit von 6 Dezimalstellen und ihr absoluter Wert überschreitet nicht 20.000.

Ausgabeformat

Es gibt eine und nur eine Linie, die der Reihe nach die n-dimensionalen Koordinaten des Kugelmittelpunkts (n reelle Zahlen) angibt, und ein Leerzeichen trennt die beiden reellen Zahlen. Jede reelle Zahl ist auf drei Dezimalstellen genau. Die Daten haben garantiert eine Lösung. Ihre Antwort muss genau mit der zu bewertenden Standardausgabe übereinstimmen.

Analysieren:

Der Mittelpunkt der Kugel soll den gleichen Abstand vom Mittelpunkt der Kugel zu den Punkten haben. Durch die Subtraktion zweier benachbarter Gleichungen wird die Unbekannte nach links verschoben.

Es gibt n unbekannte Elemente und n Gleichungen, die gelöst werden können, um die Position des Kreismittelpunkts zu ermitteln.

#include<bits/stdc++.h>
using namespace std;
inline double read() {
	char ss = getchar();
	int f = 1;
	double x = 0;
	while (ss < '0' || ss>'9') {
		if (ss == '-') {
			f = -1;
		}
		ss = getchar();
	}
	while (ss >= '0' && ss <= '9') {
		x = x * 10 + ss - '0';
		ss = getchar();
	}
	return x * f;
}

double a[20][20], c[20][20];  // c储存系数 b是每一个方程的值
int n;
double eps = 1e-7;

int main() {
	n = read();
	for (int i = 1; i <= n + 1; i++) {
		for (int j = 1; j <= n; j++) {
			scanf("%lf", &a[i][j]);
		}
	}

	for (int i = 1; i <= n; i++) {
		for (int j = 1; j <= n; j++) {
			c[i][j] = 2 * (a[i][j] - a[i + 1][j]);
			c[i][n+1] += a[i][j] * a[i][j] - a[i + 1][j] * a[i + 1][j];// 累加 平方 
		}
	}
		//高斯消元
		for (int i = 1; i <= n; i++) {
			int max = i;
			for (int j = i+1; j <= n; j++) {
				if (fabs(c[j][i]) > fabs(c[max][i])) max = j; //选最大的避免选到0
			}

			//因为这个一定有解所以没有判断是否有解的步骤
			// 交换
			for (int j = 1; j <= n+1; j++) {
				swap(c[i][j], c[max][j]);
			}
			 // c[i][n+1]是等式的值

			//消元

			for (int j = n+1; j >= 1; j--) {
				c[i][j] = c[i][j] / c[i][i]; //对角线化1
			}
			

			for (int j = 1; j <= n; j++) {
				if (j != i) {
					double temp = c[j][i] / c[i][i]; // 乘以系第i列化为0
					for (int k = 1; k <= n+1; k++) {
						c[j][k] -= c[i][k] * temp;
					}
				}
			}
		}
		
		for (int i = 1; i <= n; i++) {
			printf("%0.3lf ",c[i][n+1]);
		}
	return 0;
}

Supongo que te gusta

Origin blog.csdn.net/zhi6fui/article/details/129476867
Recomendado
Clasificación