Cod sursa(job #2340318)

Utilizator FunnyStockyMihnea Andreescu FunnyStocky Data 10 februarie 2019 11:32:51
Problema Algoritmul lui Gauss Scor 90
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 2.6 kb
#include <bits/stdc++.h>

using namespace std;

const int N = 300 + 7;

int n, m;

double gauss[N][N];
double res[N];

void Reduce() {
        int i = 1;
        int j = 1;
        while (i <= n && j <= m) {
                ///cout << "# " << i << " , " << j << "\n";
                int k = 0;
                for (k = i; k <= n; k++) {
                        if (gauss[k][j] != 0) {
                                break;
                        }
                }
                if (k > n) {
                        j++;
                } else {
                        if (k != i) {
                                for (int l = 1; l <= m + 1; l++) {
                                        swap(gauss[i][l], gauss[k][l]);
                                }
                        }
                        double value = gauss[i][j];
                        for (int l = j; l <= m + 1; l++) {
                                gauss[i][l] /= value;
                        }
                        for (int u = i + 1; u <= n; u++) {
                                double value = gauss[u][j];
                                for (int l = 1; l <= m + 1; l++) {
                                        gauss[u][l] -= value * gauss[i][l];
                                }
                        }
                        i++;
                        j++;
                }
        }
}

void FindSolution() {
        Reduce();
        for (int equation = n; equation >= 1; equation--) {
                for (int j = 1; j <= m + 1; j++) {
                        if (gauss[equation][j] != 0) {
                                if (j == m + 1) {
                                        cout << "Imposibil\n";
                                        return;
                                }
                                res[j] = gauss[equation][m + 1];
                                for (int l = j + 1; l <= m; l++) {
                                        res[j] -= res[l] * gauss[equation][l];
                                }
                                break;
                        }
                }
        }
        for (int j = 1; j <= m; j++) {
                cout << fixed << setprecision(10) << res[j] << " ";
        }
        cout << "\n";
}

int main() {
        freopen ("gauss.in", "r", stdin);
        freopen ("gauss.out", "w", stdout);
        cin >> n >> m;
        for (int i = 1; i <= n; i++) {
                for (int j = 1; j <= m + 1; j++) {
                        cin >> gauss[i][j];
                }
        }
        FindSolution();
}