Cod sursa(job #2188405)

Utilizator cristina_borzaCristina Borza cristina_borza Data 27 martie 2018 09:33:52
Problema Algoritmul lui Gauss Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.94 kb
#include <bits/stdc++.h>

using namespace std;

ifstream f ("gauss.in");
ofstream g ("gauss.out");

const double Eps = 1e-9;

double mat[ 550 ][ 550 ], ans[ 550 ];
int n, m;

int main() {
    f >> n >> m;
    for (int i = 1; i <= n; ++ i) {
        for (int j = 1; j <= m + 1; ++ j) {
            f >> mat[ i ][ j ];
        }
    }

    int lin = 1, col = 1;
    while (lin <= n && col <= m) {
        bool ok = false;
        int pos = 0;

        for (int i = lin; i <= n; ++ i) {
            if (mat[ i ][ col ] < -Eps || mat[ i ][ col ] > Eps) {
                ok = true;
                pos = i;
                break;
            }
        }

        if ( !ok ) {
            ++ col;
            continue;
        }

        if (pos != lin) {
            for (int i = 1; i <= m + 1; ++ i) {
                swap (mat[ lin ][ i ], mat[ pos ][ i ]);
            }
        }

        for (int i = col + 1; i <= m + 1; ++ i) {
            mat[ lin ][ i ] /= mat[ lin ][ col ];
        }
        mat[ lin ][ col ] = 1;

        for (int i = lin + 1; i <= n; ++ i) {
            for (int j = col + 1; j <= m + 1; ++ j) {
                mat[ i ][ j ] -= mat[ i ][ col ] * mat[ lin ][ j ];
            }

            mat[ i ][ col ] = 0;
        }

        ++ lin, ++ col;
    }

    for (int i = n; i >= 1; -- i) {
        for (int j = 1; j <= m + 1; ++ j) {
            if ( mat[ i ][ j ] < -Eps || mat[ i ][ j ] > Eps ) {
                if ( j == m + 1 ) {
                    g << "Imposibil\n";
                    return 0;
                }

                ans[ j ] = mat[ i ][ m + 1 ];
                for (int k = j + 1; k <= m; ++ k) {
                    ans[ j ] -= mat[ i ][ k ] * ans[ k ];
                }

                break;
            }
        }
    }

    for (int i = 1; i <= m; ++ i) {
        g << setprecision( 10 ) << fixed << ans[ i ] << " ";
    }
    return 0;
}