Cod sursa(job #780884)

Utilizator aranhilChivu Stefan Iulian aranhil Data 22 august 2012 18:27:46
Problema Jocul Flip Scor 0
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.41 kb
#include<stdio.h>
#include<windows.h>
#include<limits.h>

int **matr, *sum, max = INT_MIN, m, n;

void afis(int k, int *x) {
	for(int i = 0; i < n; i++) {
		printf("%d ", sum[i]);
	}
	printf("\n");
	for(int i = 0; i <= k; i++) {
		for(int j = 0; j < n; j++) {
			sum[j] -= matr[j][x[i]] * 2;
		}
	}
	for(int i = 0; i < n; i++) {
		printf("%d ", sum[i]);
	}
	printf("\n");
	int s = 0;
	for(int i = 0; i < n; i++)
		if(sum[i] < 0) s -= sum[i];
		else s += sum[i];
	printf("%d \n", s);
	if(max < s) max = s;
	for(int i = 0; i <= k; i++) {
		for(int j = 0; j < n; j++) {
			sum[j] += matr[j][x[i]] * 2;
		}
	}
}

int cc(int k, int m, int *x) {
	if(k == 0) {
		afis(k, x);
		return 1;
	}
	else if(x[k - 1] >= x[k]) return 0;
	else {
		afis(k, x);
		return 1;
	}
}

void back(int m, int *x) {
	int k = 0;
	x[0] = -1;
	while(k > -1) {
		while(x[k] < m - 1) {
			x[k]++;
			if(cc(k, m, x)) if(k != m - 1) x[++k] = 0;
		}
		k--;
	}
}

int main() {
	FILE *f = fopen("flip.in", "r");
	FILE *g = fopen("flip.out", "w");
	
	int *x;
	fscanf(f, "%d %d ", &n, &m);
	
	matr = new int*[n];
	sum = new int[n];
	for(int i = 0; i < n; i++) {
		matr[i] = new int[m];
		int s = 0;
		for(int j = 0; j < m; j++) {
			fscanf(f, "%d", &matr[i][j]);
			s += matr[i][j];
		}
		sum[i] = s;
	}
	x = new int[m];
	back(m, x);
	
	fprintf(g, "%d", max);
	
	fclose(f);
	fclose(g);
	return 0;
}