Mai intai trebuie sa te autentifici.

Cod sursa(job #995389)

Utilizator gteamG Team gteam Data 8 septembrie 2013 20:36:53
Problema Jocul Flip Scor 20
Compilator cpp Status done
Runda Arhiva de probleme Marime 5.37 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 sumForFlippedColumn(int **matrice,int n,int coloana)
{
	int suma =0 ;
	for(int i=0;i<n;++i)
		suma += matrice[i][coloana] * -1;
	return suma;
}

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

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 updateBottomBorderForFlippedLine(int **matrice,int n,int m,int line)
{
	for(int j=0;j<m;++j)
	{
		matrice[n][j] += matrice[line][j];
	}

}

void updateRightBorderForFlippedColumn(int **matrice,int n,int m,int column)
{
	for(int j=0;j<n;++j)
	{
		matrice[j][m] += 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;
}
#define SUMA_PE_LINIA_CURENTA		 matrice[i][m]
#define SUMA_PE_COLOANA_CURENTA		 matrice[n][j]


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 sumFlCol =SUMA_PE_COLOANA_CURENTA*-1;//sumForFlippedColumn(matrice,n,j);
				//daca e mai mare decat suma curenta pe coloana
				bool columnFlipped = false;

				if(sumFlCol > SUMA_PE_COLOANA_CURENTA)
				{
					flipColumnValues(matrice,n,j);
					//actualizeaza border pentru coloana
					matrice[n][j] = sumFlCol;//*= -1;

					updateRightBorderForFlippedColumn(matrice,n,m,j);
					columnFlipped = true;
				}
				

				int sumFlLine = SUMA_PE_LINIA_CURENTA*-1;//sumForFlippedLine(matrice,m,i);
			
				if(sumFlLine > SUMA_PE_LINIA_CURENTA )
				{
					if(columnFlipped)
					{
						if(sumFlLine > matrice[i][j]*-1)
						{
							//flip line too
							flipLineValues(matrice,m,i);
							//actualizeaza profitul pe linie
							matrice[i][m] =sumFlLine;//*=-1;
							updateBottomBorderForFlippedLine(matrice,n,m,i);
						}
					}
					else
					{
						
							flipLineValues(matrice,m,i);
							//actualizeaza profitul pe linie
							matrice[i][m] *=-1;
							updateBottomBorderForFlippedLine(matrice,n,m,i);
						
					}
				}
				//daca starea coloanei ar fi fost opusa celei de acum
				/*else if((sum2 = (sumFlLine + matrice[i][j]*-1)) > SUMA_PE_LINIA_CURENTA && sum2 > SUMA_PE_COLOANA_CURENTA*-1)
				{
					flipColumnValues(matrice,n,j);
					//actualizeaza border pentru coloana
					matrice[n][j] *=-1;
					updateRightBorderForFlippedColumn(matrice,n,m,j);

					//flip line too
					flipLineValues(matrice,m,i);
					//actualizeaza profitul pe linie
					matrice[i][m] =-1;
					updateBottomBorderForFlippedLine(matrice,n,m,i);
				}*/
			}
			if(matrice[i][j]>0)
			{
				
				
				
				//maximizam coloana
				int sumFlLine = SUMA_PE_LINIA_CURENTA*-1;
				int sumFlCol =SUMA_PE_COLOANA_CURENTA*-1;//sumForFlippedColumn(matrice,n,j);
				int sumFlLineFlCol = sumFlCol+matrice[i][j];
				if(sumFlLineFlCol > SUMA_PE_COLOANA_CURENTA && sumFlLineFlCol>=sumFlLine)
				{
					
					//flip line too
					flipLineValues(matrice,m,i);
					//actualizeaza profitul pe linie
					matrice[i][m] *=-1;
					updateBottomBorderForFlippedLine(matrice,n,m,i);


					//flip column too
					flipColumnValues(matrice,n,j);
					//actualizeaza border pentru coloana
					matrice[n][j] = sumFlCol;//*= -1;

					updateRightBorderForFlippedColumn(matrice,n,m,j);
				}

				//maximizam linia
				
				int sumFlColFlLine = sumFlLine+matrice[i][j];
				if(sumFlColFlLine > SUMA_PE_COLOANA_CURENTA && sumFlColFlLine>=sumFlCol)
				{
					
					

					//flip column too
					flipColumnValues(matrice,n,j);
					//actualizeaza border pentru coloana
					matrice[n][j] = sumFlCol;//*= -1;

					updateRightBorderForFlippedColumn(matrice,n,m,j);

					//flip line too
					flipLineValues(matrice,m,i);
					//actualizeaza profitul pe linie
					matrice[i][m] *=-1;
					updateBottomBorderForFlippedLine(matrice,n,m,i);

				}

			}

		}
	}

	int sumaT = sumaTotala(matrice,n,m);
	fout<<sumaT;

	dealocaMatrice(matrice,n);
	fin.close();
	fout.close();
	return 0;
}