Cod sursa(job #1414391)

Utilizator darrenRares Buhai darren Data 2 aprilie 2015 16:18:25
Problema Algoritmul lui Gauss Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.37 kb
#include <cstring>
#include <fstream>
#include <iomanip>
#include <algorithm>

using namespace std;

const double eps = 1e-6;

int N, M;
double A[302][302];
double R[302];

int main()
{
	ifstream fin("gauss.in");
	ofstream fout("gauss.out");
	
	fin >> N >> M;
	for (int i = 1; i <= N; ++i)
		for (int j = 1; j <= M + 1; ++j)
			fin >> A[i][j];
	
	for (int i = 1, j = 1; i <= N && j <= M; ++i, ++j)
	{
		int w = -1;
		for (int k = i; k <= N; ++k)
			if (fabs(A[k][j]) > eps)
			{
				w = k;
				break;
			}
		
		if (w == -1)
		{
			--i;
			continue;
		}
		
		for (int k = 1; k <= M + 1; ++k)
			swap(A[i][k], A[w][k]);
		
		for (int k = M + 1; k >= j; --k)
			A[i][k] /= A[i][j];
		for (int k = i + 1; k <= N; ++k)
			if (fabs(A[k][j]) > eps)
				for (int l = M + 1; l >= j; --l)
					A[k][l] -= A[j][l] * A[k][j];
	}
	
	bool impossible = false;
	for (int i = N; i >= 1 && !impossible; --i)
		for (int j = 1; j <= M + 1; ++j)
			if (fabs(A[i][j]) > eps)
			{
				if (j == M + 1)
				{
					impossible = true;
					break;
				}
				
				R[j] = A[i][M + 1];
				for (int k = i - 1; k >= 1; --k)
					if (fabs(A[k][j]) > eps)
					{
						A[k][M + 1] -= A[k][j] * R[j];
						A[k][j] = 0;
					}
				
				break;
			}
	
	if (impossible)
		fout << "Imposibil\n";
	else
	{
		for (int i = 1; i <= M; ++i)
			fout << fixed << setprecision(8) << R[i] << ' ';
		fout << '\n';
	}
	
	fin.close();
	fout.close();
}