Cod sursa(job #1222044)

Utilizator Luncasu_VictorVictor Luncasu Luncasu_Victor Data 22 august 2014 00:37:48
Problema Algoritmul lui Gauss Scor 50
Compilator cpp Status done
Runda Arhiva educationala Marime 1.55 kb
#include <iostream>
#include <iomanip>
#include <fstream>
#include <cstdio>
#include <cmath>
#include <cstring>
#include <vector>
#include <algorithm>
using namespace std;
#define MAX 100010
#define EPS 1e-6
ifstream f("gauss.in");
ofstream g("gauss.out");

int N, M;
double A[305][305], Sol[305], X, Y;

void Solve(int i, int j) {
	if (i > N || j > M) {
		return;
	}
	for (int x = i; x <= N; x++) {
		if (abs(A[x][j]) > EPS) {
			for (int jj = 1; jj <= M+1; jj++) {
				swap(A[i][jj], A[x][jj]);
			}
			X = 1 / A[i][j];
			for (int jj = j; jj <= M+1; jj++) {
				A[i][jj] *= X;
			}
			for (int ii = i+1; ii <= N; ii++) {
				Y = A[ii][j];
				for (int jj = j; jj <= M+1; jj++) {
					A[ii][jj] = -A[ii][jj] / Y + A[i][jj];
				}
			}
			Solve(i+1,j+1);
			return;
		}
	}
	Solve(i, j+1);
}

bool Solution() {
	int j;
	for (int i = N; i >= 1; i--) {
		j = 1;
		while (j <= M+1 && abs(A[i][j]) < EPS) j++;
		if (j == M+1) return 0;
		Sol[j] = A[i][M+1];
		for (int jj=j+1; jj <= M; jj++) {
			Sol[j] -= Sol[jj] * A[i][jj];
		}
	}
	return 1;
}

int main() {
	
	//freopen("input.in","r",stdin);
	//freopen("gauss.out","w",stdout);
	
	f >> N >> M;
	
	for (int i = 1; i <= N; i++)
	for (int j = 1; j <= M+1; j++) {
		f >> A[i][j];
	}
	
	Solve(1,1);
	
	if (Solution()) {
		g << setprecision(8) << fixed;
		for (int i = 1; i <= M; i++) g << Sol[i] << " ";
	} else {
		g << "Imposibil";
	}
	
	//for (int i = 1; i <= N; i++, printf("\n"))
	//for (int j = 1; j <= M; j++) cout << A[i][j] << " ";
		
	return 0;
}