Cod sursa(job #188647)

Utilizator Omega91Nicodei Eduard Omega91 Data 9 mai 2008 14:34:31
Problema Jocul Flip Scor 30
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.08 kb
#include <cstdio>
#include <algorithm>
using namespace std;

int s[18], spart, smax;
bool f[18];
short int n, m, x[18][18];

void calculeaza();

void citire()
{
	int i, j;
	FILE *f1;
	f1 = fopen("flip.in", "r");
	fscanf(f1, "%hd %hd\n", &n, &m);
	if (n < m) {
		for (i = 1; i <= n; ++i)
			for (j = 1; j <= m; ++j) {
				fscanf(f1, "%hd", &x[i][j]);
				x[0][j] += x[i][j];
			}
	}
	else {
		swap(n, m);
		for (j = 1; j <= m; ++j)
			for (i = 1; i <= n; ++i) {
				fscanf(f1, "%hd", &x[i][j]);
				x[0][j] += x[i][j];
			}
	}
	fclose(f1);
}

void back(int k)
{
	if (k == n + 1) {
		calculeaza();
		return;
	}
	back(k + 1);
	f[k] = !f[k];
	back(k + 1);
}

void calculeaza()
{
	int i, j;
	for (j = 1; j <= m; ++j) s[j] = x[0][j];
	for (i = 1; i <= n; ++i)
		if (f[i])
			for (j = 1; j <= m; ++j)
				s[j] -= 2 * x[i][j];
	spart = 0;
	for (j = 1; j <= m; ++j)
		if (s[j] < 0) spart -= s[j];
		else spart += s[j];
	if (smax < spart) smax = spart;
}

void afisare()
{
	FILE *f2;
	f2 = fopen("flip.out", "w");
	fprintf(f2, "%d\n", smax);
	fclose(f2);
}

int main()
{
	citire();
	back(1);
	afisare();
	return 0;
}