Cod sursa(job #1962545)

Utilizator SolcanMihaiSolcan Mihai Andrei SolcanMihai Data 11 aprilie 2017 21:04:25
Problema Algoritmul lui Gauss Scor 0
Compilator cpp Status done
Runda Arhiva educationala Marime 2.3 kb
#include <cstdio>
#include <algorithm>

using namespace std;

const int N = 305;

int n, m;
double mat[N][N];
double matx[N][N];

void citire()
{
	scanf("%d %d", &n, &m);

	for(int i = 0; i < n; i++)
	{
		for(int j = 0; j <= m; j++)
		{
			scanf("%lf", &mat[i][j]);
			matx[i][j] = mat[i][j];
		}
	}
}

void adunaLinie(int cine, int ce, double x)
{
	for(int i = 0; i <= m; i++)
	{
		mat[ce][i] += mat[cine][i] * x;
	}
}

void interschimbaLinii(int nr1, int nr2)
{
	for(int i = 0; i <= m; i++)
	{
		swap(mat[nr1][i], mat[nr2][i]);
	}
}

bool schimbaLiniiInCazDe0(int x)
{
	for(int i = x + 1; i < n; i++)				
	{
		if(mat[i][x] != 0)
		{
			interschimbaLinii(x, i);
			return true;
		}
	}

	return false;
}

void afisareDebug()
{
	for(int i = 0; i < n; i++)
	{
		for(int j = 0; j <= m; j++)
		{
			printf("%lf ", mat[i][j]);
		}
		printf("\n");
	}
}

void afisare()
{
	for(int i = 0; i < n; i++)
	{
		printf("%lf ", mat[i][m] / mat[i][i]);
	}
}

bool isValid1()
{
	for(int i = m; i < n; i++)
	{
		int sum = 0;				

		for(int j = 0; j < m; i++)
		{
			sum += matx[i][j] * mat[j][m];
		}

		if(sum != matx[i][m])
		{
			return false;
		}
	}

	return true;
}

bool solvex(int dim)
{
	for(int i = 0; i < dim; i++)
	{
		if(mat[i][i] == 0)
		{
			if(schimbaLiniiInCazDe0(i) == false)
			{
				return false;
			}
		}

		for(int j = i + 1; j < dim; j++)
		{
			if(mat[j][i] != 0)
			{
				adunaLinie(i, j, -mat[j][i] / mat[i][i]);
			}
		}
	}

	for(int i = dim - 1; i  >= 0; i--)
	{
		for(int j = i - 1; j >= 0; j--)
		{
			if(mat[j][i] != 0)
			{
				adunaLinie(i, j, -mat[j][i] / mat[i][i]);
			}
		}
	}

	return true;
}

void swapCol(int nr1, int nr2)
{
	for(int i = 0; i < n; i++)
	{
		swap(mat[i][nr1], mat[i][nr2]);
	}
}

void solve()
{
	if(n == m)
	{
		if(solvex(n) == false)
		{
			printf("Imposibil");
		}
	}
	if(n < m)
	{
		for(int k = 0; k < m; k++)
		{
			for(int i = 0; i < n; i++)	
			{
				for(int j = 0; j <= m; j++)
				{
					mat[i][j] = matx[i][j];
				}
			}		

			swapCol(k, m);

			if(solvex(n) == true)
			{
				break;
			}
		}

		return;
	}
	else if(n > m)
	{
		if(solvex(m) == false)
		{
			printf("Imposibil");
			return;
		}

		if(isValid1() == false)	
		{
			printf("Imposibil");
			return;
		}
	}

	afisare();
}

int main()
{
	freopen("gauss.in", "r", stdin);
	freopen("gauss.out", "w", stdout);

	citire();
	solve();
	
	return 0;
}