Mai intai trebuie sa te autentifici.
Cod sursa(job #995359)
Utilizator | Data | 8 septembrie 2013 18:54:43 | |
---|---|---|---|
Problema | Jocul Flip | Scor | 30 |
Compilator | cpp | Status | done |
Runda | Arhiva de probleme | Marime | 3.26 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[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;
}
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;
updateLineBorderForFlippedColumn(matrice,n,m,j);
columnFlipped = true;
}
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;
}