Cod sursa(job #643707)

Utilizator caen1c a e n caen1 Data 4 decembrie 2011 11:50:52
Problema Jocul Flip Scor 40
Compilator c Status done
Runda Arhiva de probleme Marime 1.43 kb
#include <stdio.h>
#include <math.h>
#include <string.h>

#define IN "flip.in"
#define OUT "flip.out"
#define N 20

int Tabla[N][N], Aux[N][N], Linii[N], Coloane[N];
int puteri[N] = {1, 2, 4, 8, 16, 32, 64, 128, 256, 512, 1024, 2048, 4096, 8192, 16384, 32768, 65356, 0, 0, 0};
int n, m, s_max;

int suma(void);
void aduna_unu(int [], int);
void comuta(void);

int main(void) {
	
	int i, j, c, l, m_p, n_p;
	
	freopen(IN, "r", stdin); freopen(OUT, "w", stdout);
	
	scanf("%d %d", &n, &m);
	
	for(i = 1; i <= n; ++i)
		for(j = 1; j <= m; ++j) {
			scanf("%d", &Tabla[i][j]);
			Aux[i][j] = Tabla[i][j];
		}
		
	s_max = suma();
	
	n_p = puteri[n];
	m_p = puteri[m];
	for(l = 1; l <= n_p; ++l) {
		
		memset(Coloane, 0, sizeof(Coloane));
		for(c = 1; c <= m_p; ++c) {
			
			memcpy(Tabla, Aux, sizeof(Tabla));
			comuta();
			if(suma() > s_max)
				s_max = suma();
			
			aduna_unu(Coloane, m);
		}
		
		aduna_unu(Linii, n);
	}
	
	printf("%d\n", s_max);
	
	return 0;
}

int suma(void) {
	
	int i, j, s = 0;
	
	for(i = 1; i <= n; ++i)
		for(j = 1; j <= m; ++j)
			s += Tabla[i][j];
		
	return s;
}

void aduna_unu(int v[], int l) {
	
	int i = l;
	
	while(v[i] == 1 && i) {
		
		v[i] = 0;
		i--;
	}
	
	v[i] = 1;
}

void comuta(void) {
	
	int i, j;
	
	for(i = 1; i <= n; ++i) {
		
		for(j = 1; j <= m; ++j)
			if(Linii[i] + Coloane[j] == 1)
				Tabla[i][j] = -Tabla[i][j];
	}
}