Cod sursa(job #561004)

Utilizator alex_k2Barbarasa Alex alex_k2 Data 18 martie 2011 20:00:32
Problema Jocul Flip Scor 40
Compilator cpp Status done
Runda Arhiva de probleme Marime 2.1 kb
#include <iostream>
#include <fstream>

const int d = 16;
int max;

void citire ( int a[d][d], int &n, int &m );
void afisare ( int max );
int cont ( int a[d][d], int n, int m, int pas );
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 );
void suma ( int a[d][d], int n, int m, int &max );

int main ()
{
	int a[d][d], st[d], k = 0, n, m;
	bool x = false;
	
	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();
}


/*int cont ( int a[d][d], int n, int m, int pas )
{
	bool ok = false;
	
	if ( pas > n-1 )
	{
		pas -= n;
		ok = true;
	}
	
	if ( !ok )
	{
		int s1 = 0, s2 = 0;
			
		for ( int j=0; j<m; j++ )
		{
			s1 += a[pas][j];
			s2 += a[pas][j] * (-1);
		}
			
		if ( s2 > s1 )
		{
			for ( int j=0; j<m; j++ )
				a[pas][j] *= -1;
					
			return 1;
		}
	}
	else
	{
		int s1 = 0, s2 = 0;
			
		for ( int j=0; j<n; j++ )
		{
			s1 += a[j][pas];
			s2 += a[j][pas] * (-1);
		}
			
		if ( s2 > s1 )
		{
			for ( int j=0; j<n; j++ )
				a[j][pas] *= -1;
				
			return 1;
		}
	}
	
	return 0;
}*/

void suma ( int a[d][d], int n, int m, int &max )
{
	int s = 0;
	for ( int i=0; i<n; i++ )
		for ( int j=0; j<m; j++ )
			s += a[i][j];
			
	if ( s > max )
		max = s;
}

void invers ( int a[d][d], int st[d], int n, int m, int k )
{
	bool ok = false;
	
	if ( k > n-1 )
	{
		k -= n;
		ok = true;
	}
	
	if ( !ok )
		for ( int i=0; i<m; i++ )
			a[k][i] *= (-1);
	else
		for ( int i=0; i<n; i++ )
			a[i][k] *= (-1);
}

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