Cod sursa(job #2984260)

Utilizator andreic06Andrei Calota andreic06 Data 23 februarie 2023 19:35:22
Problema Algoritmul lui Gauss Scor 60
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 2.16 kb
#include <bits/stdc++.h>

using namespace std;

const int N_MAX = 3e2;
const int M_MAX = 3e2;

const int UNIQUE = 1;
const int NONE = -1;
const double EPS = 1e-9;

const int INF = 1e9;

static inline double myabs (double x) {
   if (x < 0)
     return -x;
   return x;
}

double input[N_MAX][1 + M_MAX], answer[M_MAX];
bool Free[M_MAX];
int gauss__ (int n, int m) {
   for (int col = 0; col < m; col ++)
      Free[col] = true;
   for (int line = 0, col = 0; line < n && col < m; line ++, col ++) {
      int chosen = line;
      for (int i = line; i < n; i ++)
         if (myabs (input[chosen][col]) < myabs (input[i][col]))
           chosen = i;
      if (myabs (input[chosen][col]) < EPS) /// n-am gasit nicio linie cu coef != 0
        continue;

      Free[col] = false;
      for (int i = col; i <= m; i ++)
         swap (input[line][i], input[chosen][i]);

      /// (k, i) devine 0 oricare ar fi k != i
      for (int i = 0; i < n; i ++) {
         if (i != line) {
           double k = input[i][col] / input[line][col];
           for (int j = col; j <= m; j ++)
              input[i][j] -= k * input[line][j];
        }
      }
   }

   for (int i = 0; i < m; i ++)
      if (!Free[i])
        answer[i] = input[i][m] / input[i][i]; /// toti coef sunt 0 in afara de i

   bool solution = true;
   for (int i = 0; i < n; i ++) {
      double sum = 0;
      for (int j = 0; j < m; j ++)
         sum += answer[j] * input[i][j];
      if (myabs (sum - input[i][m]) > EPS)
        solution = false;
   }
   if (solution == true) {
     for (int j = 0; j < m; j ++)
        if (Free[j]) /// am solutie si poate sa fie ce vrea el
          return INF;
     return UNIQUE;
   }
   return NONE;
}
int main()
{
   ifstream cin ("gauss.in");
   ofstream cout ("gauss.out");

   int n, m; cin >> n >> m;
   for (int i = 0; i < n; i ++)
      for (int j = 0; j <= m; j ++)
         cin >> input[i][j];
   int counter = gauss__ (n, m);
   if (counter != NONE) {
     for (int i = 0; i < m; i ++)
        cout << fixed << " " << setprecision (10) << answer[i] << " ";
   }
   else
     cout << "Imposibil";
    return 0;
}