Cod sursa(job #613321)

Utilizator vladbagrinVlad Bagrin vladbagrin Data 21 septembrie 2011 16:04:56
Problema Jocul Flip Scor 0
Compilator c Status done
Runda Arhiva de probleme Marime 1.2 kb
#include <stdio.h>
#include <limits.h>

#define INPUT "flip.in"
#define OUTPUT "flip.out"
#define MAX 16
#define SUCCESS 1

int suma_maxima = INT_MIN;

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

void flip_line(int a[MAX][MAX], int line, int m) {
	int i;
	for (i = 0; i < m; i++) {
		a[line][i] *= -1;
	}
}

void flip_col(int a[MAX][MAX], int col, int n) {
	int i;
	for (i = 0; i < n; i++) {
		a[i][col] *= -1;
	}
}

void advance(int a[MAX][MAX], int i, int j, int n, int m) {
	if (i < n && j < m) {
		advance(a, i + 1, j, n, m);
		advance(a, i, j + 1, n, m);
		flip_line(a, i, m);
		advance(a, i + 1, j, n, m);
		flip_line(a, i, m);
		flip_col(a, j, n);
		advance(a, i, j + 1, n, m);
		flip_col(a, j, n);
	} else {
		int s = suma(a, n, m);
		if (s > suma_maxima) {
			suma_maxima = s;
		}
	}
}

int main() {
	FILE *f = fopen(INPUT, "r");
	int n, m, a[MAX][MAX], i, j;
	fscanf(f, "%d %d\n", &n, &m);

	for (i = 0; i < n; i++) {
		for (j = 0; j < m; j++) {
			fscanf(f, "%d ", &a[i][j]);
		}
	}

	advance(a, 0, 0, n, m);
	
	fclose(f);
	f = fopen(OUTPUT, "w");
	fprintf(f, "%d", suma_maxima);
	fclose(f);

	return SUCCESS;
}