Cod sursa(job #256808)

Utilizator drag0s93Mandu Dragos drag0s93 Data 12 februarie 2009 11:22:51
Problema Jocul Flip Scor 40
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.2 kb
#include<stdio.h>
#include<string.h>

#define S 20

int N,M,v[S][S],a[S][S],bst;

int bit(int x,int nr_bit )
{
	if( (x & (1<<nr_bit)) != 0 )
		return 1;
	return 0;
}

void schimbaLinie(int x)
{
	int i;
	
	for (i=0; i<N; ++i)
		a[x][i] = -a[x][i];
}

void schimbaColoana(int x)
{
	int i;
	
	for (i=0; i<M; ++i)
		a[i][x] = -a[i][x];
}

int suma()
{
	int i, j, sum = 0;
	
	for (i = 0; i < M; ++i)
		for (j = 0; j < N; ++j)
			sum += a[i][j];
	return sum;
}

int main()
{
	int l, r, k, cnt;
	
	freopen("flip.in","r",stdin);
	freopen("flip.out","w",stdout);
	scanf("%d%d",&M,&N);
	for(int i=0;i<M;++i)
		for(int j=0;j<N;++j)
			scanf("%d",&v[i][j]);
	
	for (int i=0;i <= (1<<M)-1; ++i)
		for (int j=0; j <= (1<<N)-1; ++j)
		{
			memcpy(a,v,sizeof(a));
			
			// am o submultime de linii: i
			// pentru fiecare element k din submultimea i, inmultesc cu -1 linia k
			for (k = 0; k < M; ++k)
				if (bit(i, k) == 1)
					schimbaLinie(k);
				
			// fac acelasi lucru pentru coloane
			for (k = 0; k < N; ++k)
				if (bit(j, k) == 1)
					schimbaColoana(k);
				
			cnt = suma();
			
			if (bst < cnt)
				bst = cnt;
		}
		
	printf("%d\n", bst);
	
	return 0;
}