Cod sursa(job #1289699)

Utilizator teoionescuIonescu Teodor teoionescu Data 10 decembrie 2014 10:23:14
Problema Algoritmul lui Gauss Scor 70
Compilator cpp Status done
Runda Arhiva educationala Marime 1.48 kb
#include<fstream>
using namespace std;
ifstream in("gauss.in");
ofstream out("gauss.out");
const int Nmax = 303;
double A[Nmax][Nmax],Sol[Nmax];
int N,M,st[Nmax];
void swapr(int x,int y,int col){
    for(int i=col;i<=M+1;i++) swap(A[x][i],A[y][i]);
}
int has(int x,int y){
    for(int i=x;i<=N;i++) if(A[i][y] != 0.){
        swapr(x,i,y);
        return 1;
    }
    return 0;
}
void divide(int x,int y){
    for(int i=x;i<=N;i++){
        double c=A[i][y];
        if(c) for(int j=y;j<=M+1;j++) A[i][j]/=c;
    }
}
void substract(int x,int y){
    for(int i=x+1;i<=N;i++){
        if(A[i][y] != 0.) for(int j=y;j<=M+1;j++) A[i][j]-=A[x][j];
    }
}
void print(){for(int i=1;i<=N;i++){for(int j=1;j<=M+1;j++){out<<A[i][j]<<' ';}out<<'\n';}out<<"\n\n";}
int main(){
    in>>N>>M;
    for(int i=1;i<=N;i++) for(int j=1;j<=M+1;j++) in>>A[i][j];
    int row=1,col=1;
    while(row<=N && col<=M){
        if(!has(row,col)) col++;
        else{
            st[row]=col;
            divide(row,col);
            substract(row,col);
            row++;
        }
    }
    int e=row-1;
    for(;row<=N;row++) if(A[row][M+1]){
        out<<"Imposibil\n";
        return 0;
    }
    for(int j=M;j>=1;j--){
        if(st[e]!=j) Sol[j]=0.;
        else{
            double val=0.;
            for(int k=j+1;k<=M;k++) val+=Sol[k]*A[e][k];
            Sol[j]=A[e][M+1]-val;
            e--;
        }

    }
    out.precision(11);
    for(int i=1;i<M;i++) out<<fixed<<Sol[i]<<' ';
    out<<fixed<<Sol[M]<<'\n';
    return 0;
}