Cod sursa(job #58671)

Utilizator C11H17NO3Mesc Alin C11H17NO3 Data 6 mai 2007 19:18:19
Problema Jocul Flip Scor 30
Compilator c Status done
Runda Arhiva de probleme Marime 1.12 kb
#include <stdio.h>
#define N 16
#define M 16
int b[N][M];
int n, m;

int sum()
{
	int s, i, j;

	for (s = 0, i = 0; i < n; ++i)
		for (j = 0; j < m; ++j)
			s += b[i][j];
	return s;
}

void flipr(int r)
{
	int i;

	for (i = 0; i < m; ++i)
		b[r][i] = -b[r][i];
}

void flipc(int c)
{
	int i;

	for (i = 0; i < n; ++i)
		b[i][c] = -b[i][c];
}

int flipctest(int c)
{
	int s, sf, i;
	for (s = 0, sf = 0, i = 0; i < n; ++i) {
		s += b[i][c];
		sf += -b[i][c];
	}
	if (sf > s) return 1;
	return 0;
}

int fliprtest(int r)
{
	int s, sf, i;
	for (s = 0, sf = 0, i = 0; i < m; ++i) {
		s += b[r][i];
		sf += -b[r][i];
	}
	if (sf > s) return 1;
	return 0;
}

int main(int argc, char *argv[])
{
	FILE *in, *out;
	int i, j, s, s1;
	in = fopen("flip.in", "r");
	out = fopen("flip.out", "w");
	fscanf(in, "%d", &n);
	fscanf(in, "%d", &m);
	for (i = 0; i < n; ++i)
		for (j = 0; j < m; ++j) {
			fscanf(in, "%d", &b[i][j]);
	}

	do {
		s = sum();
		for (i = 0; i < n; ++i)
			if (fliprtest(i)) flipr(i);
		for (j = 0; j < m; ++j)
			if (flipctest(j)) flipc(j);
		s1 = sum();
	} while (s1 > s);
	fprintf(out, "%d", sum());

	fclose(in); fclose(out);
	return 0;
}