Cod sursa(job #1083119)

Utilizator danny794Dan Danaila danny794 Data 15 ianuarie 2014 17:15:25
Problema Algoritmul lui Gauss Scor 60
Compilator cpp Status done
Runda Arhiva educationala Marime 1.48 kb
#include <cstdio>
#include <cmath>

using namespace std;

const int NMAX = 305;
int N, M;
double matrix[NMAX][NMAX];
double solution[NMAX];

void read() {
	freopen( "gauss.in", "r", stdin );
	freopen( "gauss.out", "w", stdout );
	scanf("%i %i", &N, &M);
	for( int i = 1; i <= N; i++ )
		for( int j = 1; j <= M + 1; j++ )
			scanf("%lf", &matrix[i][j]);
}

void reduce(int k) {
	bool ok;
	int p = -1;
	for( int i = 1; i <= N; i++ ) {
		ok = true;
		for( int j = 1; j < k; j++ )
			if( abs(matrix[i][j]) > 0.0000000001 ) {
				ok = false;
			}
		if( abs(matrix[i][k]) < 0.0000000001 )
			ok = false;
		if( ok ) {
			p = i;
			break;
		}
 	}

	if ( ok ) {
		for( int i = 1; i <= N; i++ )
			if( i != p ) {
				double coeff = matrix[i][k] / matrix[p][k];
				for( int j = 1; j <= M + 1; j++ )
					matrix[i][j] -= (matrix[p][j] * coeff);
			}
		reduce(k + 1);
	}
}

void printSolution() {
	bool ok, sol = true;
	for( int i = 1; i <= N; i++ ) {
		ok = false;
		for( int j = 1; j <= M; j++ )
			if( abs(matrix[i][j]) > 0.0000000001 ) {
				solution[j] = matrix[i][M + 1] / matrix[i][j];
				ok = true;
				break;
			}
		if ( !ok && abs(matrix[i][M+1]) > 0.0000000001 ) {
			sol = false;
			break;
		}
	}

	if( sol ) {
		for(int i = 1; i <= M; i++)
			printf("%.10lf ", solution[i]);
	} else {
		printf("Imposibil!\n");
	}
}

int main() {
	read();
	reduce(1);
	printSolution();
	printf("\n");
	for(int i = 1; i <= N; i++) {
		for(int j = 1; j <= M + 1; j++)
			printf("%lf ", matrix[i][j]);
		printf("\n");
	}

	return 0;
}