Cod sursa(job #1240592)

Utilizator danny794Dan Danaila danny794 Data 11 octombrie 2014 18:45:11
Problema Algoritmul lui Gauss Scor 90
Compilator cpp Status done
Runda Arhiva educationala Marime 1.84 kb
#include <cstdio>
#include <cmath>

#define MAX 305
#define epsilon 0.001
#define test(a) (abs(a) > epsilon)

int N, M;
double matrix[MAX][MAX];
double solution[MAX];

using namespace std;

void printMatrix();

void read()
{
  freopen("gauss.in", "r", stdin);
  freopen("gauss.out", "w", stdout);
  scanf("%d %d", &N, &M);
  M++;
  for(int i = 0; i < N; i++)
  {
    for(int j = 0; j < M; j++)
    {
      scanf("%lf", &matrix[i][j]);
    }
  }
}

inline void switchRows(int a, int b)
{
  double aux;
  for(int j = 0; j < M; j++)
  {
    aux = matrix[a][j];
    matrix[a][j] = matrix[b][j];
    matrix[b][j] = aux;
  }
}

void elimination()
{
  int index;

  for(int c = 0; c < M; c++)
  {
    index = -1;
    for(int i = c; i < N; i++)
    {
      if(test(matrix[i][c]))
      {
        index = i;
        break;
      }
    }

    if (index == -1)
      continue;

    switchRows(c, index);

    double aux = matrix[c][c];
    for(int j = c; j < M; j++)
      matrix[c][j] = matrix[c][j] / aux;

    for(int i = c + 1; i < N; i++)
    {
      aux = matrix[i][c];
      for(int j = c; j < M; j++)
      {
        matrix[i][j] = matrix[i][j] - matrix[c][j] * aux;
      }
    }
  }
}

void printMatrix()
{
  for(int i = 0; i < N; i++)
  {
    for(int j = 0; j < M; j++)
    {
      printf("%.10lf ", matrix[i][j]);
    }
    printf("\n");
  }
}

int solve()
{
  if(M <= N)
  {
    if(!test(matrix[M][M]))
      return 0;
  }

  int min = N > M ? M : N;

  for(int i = min - 1; i >= 0; i--)
  {
    if(!test(matrix[i][i]))
      continue;

    solution[i] = matrix[i][M-1];
    for(int j = i + 1; j < M - 1; j++)
      solution[i] -= matrix[i][j] * solution[j];
  }

  return 1;
}

int main()
{
  read();
  elimination();
  int r = solve();

  if(r)
  {
    for(int i = 0; i < M - 1; i++)
      printf("%.10lf ", solution[i]);
  }
  else
  {
    printf("Imposibil");
  }
  return 0;
}