Cod sursa(job #561352)

Utilizator mayhemx77Voinea C. Vladimir mayhemx77 Data 19 martie 2011 21:48:38
Problema Jocul Flip Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.27 kb
#include <iostream>
#include <fstream>

const int d = 20;
int max;

void citire ( int a[d][d], int &n, int &m );
void afisare ( int max );
void back ( int a[d][d], int st[d], int n, int m, int k, int &max );
void invers ( int a[d][d], int st[d], int n, int m, int k, int &max );
void suma ( int a[d][d], int n, int m, int &max );

int main ()
{
	int a[d][d], st[d], k = 0, n, m;
	
	citire(a,n,m);
	back(a,st,n,m,k,max);
	afisare(max);
	
	return 0;
}

void citire ( int a[d][d], int &n, int &m )
{
	std::ifstream f("flip.in");
	
	f >> n >> m;
	for ( int i=0; i<n; i++ )
		for ( int j=0; j<m; j++ )
			f >> a[i][j];
	
	f.close();
}	

void afisare ( int max )
{
	std::ofstream g("flip.out");
	g << max;
	g.close();
}

void invers ( int a[d][d], int st[d], int n, int m, int k, int &max )
{
	if ( st[k] )
		for ( int i=0; i<m; i++ )
			a[k][i] *= -1;
		
	int sf = 0;
	for ( int i=0; i<m; i++ )
	{
		int s = 0;
		for ( int j=0; j<n; j++ )
			s += a[j][i];
		
		if ( s < 0 )
			s *= -1;
			
		sf += s;
	}
	
	if ( sf > max )
		max = sf;
}

void back ( int a[d][d], int st[d], int n, int m, int k, int &max )
{
	if ( k < n )
	{
		for ( int i=0; i<2; i++ )
		{
			st[k] = i;
			invers(a,st,n,m,k,max);
			back(a,st,n,m,k+1,max);
		}
	}
}