Cod sursa(job #995346)

Utilizator gteamG Team gteam Data 8 septembrie 2013 18:30:54
Problema Jocul Flip Scor 20
Compilator cpp Status done
Runda Arhiva de probleme Marime 3.23 kb
#include<fstream>
#include<iostream>
using namespace std;
int **alocaMatrice(int n,int m)
{
	int **matrice = new int *[n];
	for(int i=0;i<n;++i)
		matrice[i] = new int[m];
	return matrice;
}

void dealocaMatrice(int **matrice,int n)
{
	for(int i=0;i<n;++i)
		delete []matrice[i];
	delete[] matrice;
}

void bordeazaMatriceaCuSumaElem(int **matrice,int n,int m)
{
	int suma = 0;
	int i,j;
	//mai intai pe coloane
	for(i=0;i<n;++i)
	{
		suma = 0;
		for(j=0;j<m;++j)
		{
			suma += matrice[i][j];
		}
		matrice[i][j] = suma;
	}

	//apoi pe linii
	for(i=0;i<m;++i)
	{
		suma = 0;
		for(j=0;j<n;++j)
		{
			suma += matrice[j][i];
		}
		matrice[n][i] = suma;
	}
	matrice[n][m] = -1111111;
}

void afiseazaMatrice(int **matrice,int n,int m)
{
	for(int i=0;i<n;++i)
	{
		for(int j=0;j<m;++j)
		{
			cout<<matrice[i][j]<<" ";
		}
		cout<<endl;
	}
}

int profitForFlippedColumn(int **matrice,int n,int coloana)
{
	int suma =0 ;
	for(int i=0;i<n;++i)
		suma += matrice[i][coloana] * -1;
	return suma*2;
}

int profitForFlippedLine(int **matrice,int m,int line)
{
	int suma =0 ;
	for(int i=0;i<m;++i)
		suma += matrice[line][i] * -1;
	return suma*2;
}

void flipColumnValues(int **matrice,int n,int coloana)
{
	for(int i=0;i<n;++i)
		matrice[i][coloana] *=  -1;	
}

void flipLineValues(int **matrice,int m,int line)
{
	for(int i=0;i<m;++i)
		matrice[line][i] *=  -1;	
}

void updateColumnBorderForFlippedLine(int **matrice,int n,int m,int line)
{
	for(int j=0;j<m;++j)
	{
		matrice[n][j] += matrice[line][j];
	}
	
}

void updateLineBorderForFlippedColumn(int **matrice,int n,int m,int column)
{
	for(int j=0;j<n;++j)
	{
		matrice[m][j] += matrice[j][column];
	}

}

int sumaTotala(int **matrice,int n,int m)
{
	int suma = 0;
	for(int i=0;i<n;++i)
	{
		for(int j=0;j<m;++j)
		{
			suma += matrice[i][j];
		}
	}
	return suma;
}
int main()
{
	ifstream fin("flip.in");
	ofstream fout("flip.out");
	int n,m;
	fin>>n>>m;
	//aloca si pentru bordura
	int **matrice = alocaMatrice(n+1,m+1);
	for(int i=0;i<n;++i)
		for(int j=0;j<m;++j)
			fin>>matrice[i][j];

	bordeazaMatriceaCuSumaElem(matrice,n,m);
	//cautam numere negative
	for(int i=0;i<n;++i)
	{
		for(int j=0;j<m;++j)
		{
			if(matrice[i][j]<0)
			{
				int profitFColumn = profitForFlippedColumn(matrice,n,j);
				//daca e mai mare decat suma curenta pe coloana
				bool columnFlipped = false;
				if(profitFColumn/2 > matrice[n][j])
				{
					flipColumnValues(matrice,n,j);
					//actualizeaza border pentru coloana
					matrice[n][j] = profitFColumn / 2;
					updateColumnBorderForFlippedLine(matrice,n,m,i);
				}

				int profitFLine = profitForFlippedLine(matrice,m,i);

				if(profitFLine/2 > matrice[i][m] )
				{
					if(columnFlipped)
					{
						if(profitFLine > matrice[i][j]*-2)
						{
							//flip line too
							flipLineValues(matrice,m,i);
							updateColumnBorderForFlippedLine(matrice,n,m,i);
						}
					}
					else
					{
						flipLineValues(matrice,m,i);
						updateColumnBorderForFlippedLine(matrice,n,m,i);
					}
				}
			}
		}
	}

	int sumaT = sumaTotala(matrice,n,m);
	fout<<sumaT;
	
	dealocaMatrice(matrice,n);
	fin.close();
	fout.close();
	return 0;
}