Cod sursa(job #1502649)

Utilizator George-AndreiGeorge Andrei George-Andrei Data 14 octombrie 2015 21:23:41
Problema Jocul Flip Scor 40
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.25 kb
#include<stdio.h>
int m, n, st[40];
long int v[20][20], copie[20][20], MAX;

void onoff() {
	int i, j;
	for (i = 0; i < n; i++) {
		for (j = 0; j < m; j++) {
			copie[i][j] = 0;
		}
	
	}
}

int suma() {
	int s = 0, x, y;
	for (x = 0; x < n; x++)
		for (y = 0; y < m; y++) { 
			if (copie[x][y] == 1) s += -1 * v[x][y];
			else s += v[x][y];
		}
	return s;
}

void flipline(int a) {
	int x;
	for (x = 0; x < m; x++) {
		if (copie[a][x] == 0)copie[a][x] = 1;
		else copie[a][x] = 0;
	}
}

void flipcol(int a) {
	int x;
	for (x = 0; x < n; x++){
		if (copie[x][a] == 0)copie[x][a] = 1;
		else copie[x][a] = 0;
	}
}


void maxim() {
	int i, x, j;
	onoff();
	for (i = 0; i < n; i++)if (st[i] == 1)flipline(i);
	for (j = n; j < m + n; j++)if (st[j] == 1)flipcol(j - n);
	x = suma();
	if (x > MAX) MAX = x;
}

void back(int p) {
	int val;
	for (val = 0; val < 2; val++) {
		st[p] = val;
		if (p == m + n - 1) maxim();
		else back(p + 1);
	}


}

int main() {
	freopen("flip.in", "r", stdin);
	freopen("flip.out", "w", stdout);
	scanf("%d", &n);
	scanf("%d", &m);
	int i, j;
	for (i = 0; i < n; i++) {
		for (j = 0; j < m; j++) {
			scanf("%d", &v[i][j]);
		}
	};
	
	back(0);
	
	printf("%d", MAX);

	return 0;
}