Cod sursa(job #2027231)

Utilizator borcanirobertBorcani Robert borcanirobert Data 25 septembrie 2017 19:55:44
Problema Algoritmul lui Gauss Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 2.16 kb
#include <fstream>
#include <iomanip>
#include <iostream>
#include <vector>
using namespace std;

ifstream fin("gauss.in");
ofstream fout("gauss.out");

const int MAX = 310;
const double eps = 0.0000001;
int N, M;
double a[MAX][MAX];
double res[MAX];
bool imp;

void Read();
void Gauss();
void Write();

int main()
{
    Read();
    Gauss();
    Write();

    fin.close();
    fout.close();
    return 0;
}

void Read()
{
    fin >> N >> M;
    for ( int i = 1; i <= N; ++i )
        for ( int j = 1; j <= M + 1; ++j )
            fin >> a[i][j];
}

void Gauss()
{
    int i{1}, j{1}, k;
    while ( i <= N && j <= M )
    {
        // Caut o nilie k pentru care a[i][k] e nenul si daca acea linie
        // nu e linia i o voi interschimba cu linia i
        for ( k = i; k <= N; ++k )
            if ( a[k][j] < -eps || a[k][j] > eps )
                break;

        if ( k == N + 1 )
        {
            ++j;
            continue;
        }

        if ( k != i )
        {
            for ( int col = 1; col <= M + 1; ++col )
                swap(a[k][col], a[i][col]);
        }

        for ( int col = j + 1; col <= M + 1; ++col )
            a[i][col] /= a[i][j];
        a[i][j] = 1.;

        for ( int lin = i + 1; lin <= N; ++lin )
        {
            for ( int col = j + 1; col <= M + 1; ++col )
                a[lin][col] -= a[lin][j] * a[i][col];
            a[lin][j] = 0;
        }

        ++i; ++j;
    }

    for ( i = N; i > 0; --i )
        for ( j = 1; j <= M + 1; ++j )
            if ( a[i][j] < -eps || a[i][j] > eps )
            {
                if ( j == M + 1 )
                {
                    imp = true;
                    return;
                }

                res[j] = a[i][M + 1];
                //res.push_back(a[i][M + 1]);
                for ( k = j + 1; k <= M; ++k )
                    res[j] -= res[k] * a[i][k];
                break;
            }
}

void Write()
{
    if ( imp )
    {
        fout << "Imposibil\n";
        return;
    }

    for ( int i = 1; i <= M; ++i )
        fout << fixed << setprecision(10) << res[i] << ' ';
}