Cod sursa(job #1706758)

Utilizator UPB_Darius_Rares_SilviuPeace my pants UPB_Darius_Rares_Silviu Data 23 mai 2016 08:58:13
Problema Algoritmul lui Gauss Scor 0
Compilator cpp Status done
Runda Arhiva educationala Marime 2.04 kb
#include <stdio.h>
#include <math.h>
#include <algorithm>
#define NMax 310

using namespace std;

int N, M;
double Mat[NMax][NMax];
double Rez[NMax];
bool Solution = true;

bool zero( double val ) {
    return fabs(val) < 0.1;
}

void gauss() {

    int j = 1;

    for ( int i = 1; i <= N && j <= M; ++ i ) {

        fprintf(stderr, "(%d, %d)\n", i, j);

        int max_k = i;
        for ( int k = i; k <= N; ++ k )
            if ( ! zero(Mat[k][j]) ) {
                max_k = k;
                break;
            }

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

        if ( Mat[i][j] == 0 ) {
            ++ j; -- i;
            continue;
        }

        for ( int k = 1; k <= N; ++ k ) if ( k != i && !zero(Mat[k][j]) ) {
            double x = Mat[i][j];
            double y = Mat[k][j];

            for ( int l = j; l <= M + 1; ++ l )
                Mat[k][l] = Mat[k][l] * x / y - Mat[i][l];
            Mat[k][j] = 0;
        }
        ++ j;

    }

    for ( int i = 1; i <= N; ++ i)
        for ( int k = j; k <= M; ++ k )
            Mat[i][k] = 0;

    for ( int i = N; i > 0; -- i ) {

        int j;
        for ( j = M; zero(Mat[i][j]) && j > 0; -- j );
        if ( j == 0 ) continue;

        Rez[j] = Mat[i][M + 1] / Mat[i][j];

    }

    for ( int i = 1; i <= N; ++ i ) {

        int j;
        for ( j = 1; j <= M && zero(Mat[i][j]); ++ j );
        if ( j == M + 1 && ! zero(Mat[i][j]) )
            Solution = false;
    }

}


int main() {

    freopen("gauss.in", "r", stdin);
    freopen("gauss.out", "w", stdout);

    scanf("%d%d", &N, &M);

    for ( int i = 1; i <= N; ++ i )
        for ( int j = 1; j <= M + 1; ++ j )
            scanf("%lf", &Mat[i][j]);

    gauss();

    if ( ! Solution ) {
        printf("Imposibil\n");
        return 0;
    }

    for ( int i = 1; i <= M; ++ i )
        printf("%.10lf ", Rez[i]);
    printf("\n");

    return 0;
}