Cod sursa(job #3342242)

Utilizator bagae123Burlacu Andrei bagae123 Data 23 februarie 2026 14:54:03
Problema Algoritmul lui Gauss Scor 100
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 2.08 kb
#include <bits/stdc++.h>
using namespace std;

const int MAXN = 305;
const double EPS = 1e-10;

int N, M;
double A[MAXN][MAXN]; // matrice extinsă N x (M+1)

int main() {
    ifstream fin("gauss.in");
    ofstream fout("gauss.out");

    fin >> N >> M;
    for (int i = 0; i < N; i++)
        for (int j = 0; j <= M; j++)
            fin >> A[i][j];

    int i = 0, j = 0;
    vector<int> pivot_pos(M, -1); // -1 pentru variabile libere

    while (i < N && j < M) {
        // caut pivot
        int row = i;
        for (int k = i; k < N; k++)
            if (fabs(A[k][j]) > fabs(A[row][j]))
                row = k;

        if (fabs(A[row][j]) < EPS) {
            // coloana j → variabilă liberă
            j++;
            continue;
        }

        // swap rânduri
        for (int col = 0; col <= M; col++)
            swap(A[i][col], A[row][col]);

        pivot_pos[j] = i;

        // normalizare pivot
        double pivot = A[i][j];
        for (int col = j; col <= M; col++)
            A[i][col] /= pivot;

        // eliminare sub pivot
        for (int u = 0; u < N; u++) {
            if (u == i) continue;
            double factor = A[u][j];
            for (int col = j; col <= M; col++)
                A[u][col] -= factor * A[i][col];
        }

        i++;
        j++;
    }

    // verificare imposibil
    for (int row = 0; row < N; row++) {
        bool all_zero = true;
        for (int col = 0; col < M; col++)
            if (fabs(A[row][col]) > EPS) {
                all_zero = false;
                break;
            }
        if (all_zero && fabs(A[row][M]) > EPS) {
            fout << "Imposibil\n";
            return 0;
        }
    }

    // calcul solutii
    vector<double> x(M, 0.0);
    for (int col = 0; col < M; col++) {
        int row = pivot_pos[col];
        if (row == -1) continue; // variabila libera → 0
        x[col] = A[row][M];
    }

    fout << fixed << setprecision(8);
    for (int k = 0; k < M; k++)
        fout << x[k] << " ";
    fout << "\n";

    return 0;
}