Cod sursa(job #1577558)

Utilizator TimitocArdelean Andrei Timotei Timitoc Data 23 ianuarie 2016 16:00:02
Problema Algoritmul lui Gauss Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 2.16 kb
#include <iostream>
#include <cstdio>
#define MAXN 350

using namespace std;

double a[MAXN][MAXN], sol[MAXN];
int n, m, p[MAXN];
const double EPS = 1e-9;

void citire()
{
    scanf("%d %d", &n, &m);
    for (int i = 0; i < n; i++)
        for (int j = 0;  j <= m; j++)
            scanf("%lf", &a[i][j]);
}

void exch(double x, double y)
{
    double aux = x;
    x = y;
    y = aux;
}

void exch(double e[MAXN], double f[MAXN])
{
    for (int i = 0; i <= m; i++)
        exch(e[i], f[i]);
}

void solve()
{
    for (int i = 0, j = 0; i < n && j < m; i++, j++)
    {
        int pos = -1;
        while (true) {
            for (int ec = i; ec < n; ec++)
                if (a[ec][j])
                    pos = ec, ec = n;
            if (pos != -1) break;
            j++;
            if (j >= m)
                return;
        }
        exch(a[i], a[pos]);
        double val = a[i][j];
        for (int k = j; k <= m; k++)
            a[i][k] /= val;
        for (int ki = i+1; ki < n; ki++) {
            val = a[ki][j];
            for (int kj = j; kj <= m; kj++)
                a[ki][kj] -= a[i][kj]*val;
        }
        p[i] = j;
    }
}

void debug()
{
    for (int i = 0; i < n; i++) {
        for (int j = 0; j < m; j++)
            printf("%lf\t", a[i][j]);
        printf("=\t%lf\n", a[i][m]);
    }
}

void afisare()
{
    for (int i = n-1; i >= 0; i--) {
        double sum = 0;
        for (int j = p[i]+1; j < m; j++)
            sum += a[i][j] * sol[j];
        sol[p[i]] = a[i][m] - sum;
    }
    for (int i = 0; i < m; i++)
        printf("%.8lf ", sol[i]);
}

int abs(double x)
{
    if (x < 0) return -x;
    return x;
}

int posibil()
{
    for (int i = 0; i < n; i++) {
        int ok = 0;
        for (int j = 0; j < m; j++)
            ok |= (abs(a[i][j]) > EPS);
        if (!ok && abs(a[i][m]) > EPS)
            return 0;
    }
    return 1;
}

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

    citire();
    solve();
   // debug();
    if (posibil())
        afisare();
    else
        printf("Imposibil");
    return 0;
}