Cod sursa(job #1652200)

Utilizator laurageorgescuLaura Georgescu laurageorgescu Data 14 martie 2016 19:25:12
Problema Algoritmul lui Gauss Scor 40
Compilator cpp Status done
Runda Arhiva educationala Marime 2.14 kb
#include<cstdio>

using namespace std;

FILE *fin = fopen( "gauss.in", "r" ), *fout = fopen( "gauss.out", "w" );

const int nmax = 300;
const int mmax = 300;
const double eps = 1e-10;
int n, m;
double ans[ mmax + 1 ];
double a[ nmax + 1 ][ mmax + 2 ];

void schimba( int x, int y ) {
    for( int i = 1; i <= m + 1; ++ i ) {
        double aux = a[ x ][ i ];
        a[ x ][ i ] = a[ y ][ i ];
        a[ y ][ i ] = aux;
    }
}
void simplifica( int x, int y ) {
    for( int i = x + 1; i <= n; ++ i ) {
        double k = a[ i ][ y ];
        for( int j = 1; j <= m + 1; ++ j ) {
            a[ i ][ j ] -= a[ x ][ j ] * k;
        }
    }
}
int main() {
    fscanf( fin, "%d%d", &n, &m );
    for( int i = 1; i <= n; ++ i ) {
        for( int j = 1; j <= m + 1; ++ j ) {
            fscanf( fin, "%lf", &a[ i ][ j ] );
        }
    }

    int ind = 1;
    for( int i = 1; i <= n; ++ i ) {
        int x;
        while( ind <= m ) {
            x = i;
            while ( x <= n && a[ x ][ ind ] < eps && -eps < a[ x ][ ind ] ) {
                ++ x;
            }
            if ( x <= n ) {
                break;
            }
            ++ ind;
        }

        if ( ind <= m ) {
            schimba( i, x );
            for( int j = m + 1; j >= ind; -- j ) {
                a[ i ][ j ] /= a[ i ][ ind ];
            }
            simplifica( i, ind );
            ++ ind;
        } else {
            break;
        }
    }

    bool ok;
    for( int i = n; i > 0; -- i ) {
        ok = 0;
        for( int j = 1; j <= m; ++ j ) {
            if ( a[ i ][ j ] > eps || a[ i ][ j ] < -eps ) {
                ok = 1;
                ans[ j ] = a[ i ][ m + 1 ];
                for( int k = j + 1; k <= m; ++ k ) {
                    ans[ j ] -= a[ i ][ k ] * ans[ k ];
                }
                break;
            }
        }
        if ( ok == 0 && (a[ i ][ m + 1 ] > eps || a[ i ][ m + 1 ] < -eps) ) {
            break;
        }
    }
    if ( ok == 1 ) {
        for( int i = 1; i <= m; ++ i ) {
            fprintf( fout, "%lf ", ans[ i ] );
        }
    } else {
        fprintf( fout, "Imposibil\n" );
    }
    fclose( fin );
    fclose( fout );
    return 0;
}