Cod sursa(job #612866)

Utilizator dbalutaDaniel Baluta dbaluta Data 11 septembrie 2011 21:21:14
Problema Jocul Flip Scor 20
Compilator c Status done
Runda Arhiva de probleme Marime 1.08 kb
#include <stdio.h>
#include <stdlib.h>

#define NMAX	16
#define MMAX	16

int N, M;
int table[NMAX][MMAX];
int death_row[MMAX];
int max_sum = -1;

void init_death_row()
{
	int i;
	for (i = 0; i < M; i++) 
		death_row[i] = 1;
}

void read_data()
{
	int i, j;
	FILE *f = fopen("flip.in", "r");
	if (!f) {
		perror("fopen in:");
		exit(-1);
	}

	fscanf(f, "%d %d", &M, &N);
	
	for(i = 0; i < N; i++)
		for(j = 0; j < M; j++)
			fscanf(f, "%d", &table[i][j]);
}


void write_data()
{
	FILE *f = fopen("flip.out", "w");
	if (!f) {
		perror("fopen out:");
		exit(-1);
	}

	fprintf(f, "%d", max_sum);
}

int do_sum() {
	int i, j, sum = 0, tsum = 0; 
	for (i = 0; i < N; i++) {
		tsum = 0;
		for (j = 0; j < M; j++) {
			/* flip negative row sums */
			tsum += table[i][j] * death_row[j];
			if (tsum < 0) 
				tsum = -tsum;
		}
		sum += tsum;
	}
	if (sum > max_sum) 
		 max_sum = sum;
}

void Solve(int i) {
	if (i == M) 
		return;

	death_row[i] = 1;
	do_sum();
	Solve(i+1);

	death_row[i] = -1;
	do_sum();
	Solve(i+1);
}

int main(void) {
	
	read_data();
	init_death_row();
	Solve(0);
	write_data();
	return 0;
}