Cod sursa(job #972263)

Utilizator andrei213Andrei Cibotaru andrei213 Data 11 iulie 2013 13:09:31
Problema Jocul Flip Scor 10
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.55 kb
#include <iostream>
#include <fstream>

using namespace std;


void bt (int **& mat, int &m, int &n, int &sum, int & result);
void col (int **& mat, int &i, int &m, int &n);
void row (int **& mat, int &i, int &m, int &n);


int main (){
ifstream ifs("flip.in", ios_base::in);
ofstream ofs("flip.out", ios_base::out);
int n, m, **mat= 0;
int sum;
int result = 0;

if (!ifs.is_open()|| !ofs.is_open() )return -1;  
ifs >> n;
ifs >> m;

sum = 0 ; 
mat = new int*[n];
for (int i = 0 ; i < n ; ++i){
	mat[ i ] = new int [ m ] ;
	for (int j = 0; j < m ; ++j){
		ifs >> mat[ i ][ j ] ;
		sum += mat[ i ][ j ] ;
	}		
}

ifs.close();

bt( mat, m, n, sum, result );

ofs<< result << endl;

ofs.close();

for (int i = 0 ; i < n ; ++i)
	delete[] mat[i]; 

delete[] mat ;

return 0;
}

void col ( int **& mat, int &i, int &m, int &n ){
	for (int j = 0 ; j < n ; ++j )
		mat[j][i] *= (-1);	
}

void row (int **&mat, int &i, int &m, int &n){
	for (int j = 0 ; j < m ; ++j)
		mat[i][j] *= (-1);
}

void summat (int **&mat, int &m, int &n, int &sum){
	sum = 0 ;
	for (int i = 0 ; i < n ; ++i)
		for (int j = 0 ; j < m; ++j )
			sum += mat[i][j];	
}

void bt (int **&mat, int &m, int &n, int &sum, int &result){
int nsum = sum;
	for (int i = 0 ; i < n; ++i){
		col(mat, i, m, n);
		summat ( mat, m, n, nsum );		
		if (nsum > sum){
			result = nsum;
			bt ( mat, m, n, nsum, result );
		}
	
		col(mat, i, m, n);						
	}
	
	for (int j = 0 ; j < m ;++j){
		row( mat, j, m, n);
		summat( mat, m, n, nsum );
		if (nsum > sum){
			result = nsum;
			bt ( mat, m, n, nsum, result );
		}
		row ( mat, j, m, n  );
	}
}