Mai intai trebuie sa te autentifici.
Cod sursa(job #995389)
Utilizator | 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;
}