Cod sursa(job #1338330)

Utilizator aimrdlAndrei mrdl aimrdl Data 9 februarie 2015 22:44:20
Problema Jocul Flip Scor 20
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.73 kb
#include <stdio.h>
#include <stdlib.h>
#include <string.h>

void flip (int **mat, int m, int n, int k, bool row) {
	if (row) {
		for (int i = 0; i < n; i++) {
			mat[k][i] = -mat[k][i];
		}
	} else {
		for (int i = 0; i < m; i++) {
			mat[i][k] = -mat[i][k];
		}
	}
}
		
	

void print (int **mat, int m, int n) {
	for (int i = 0; i < m; i++) {
		for (int j = 0; j < n; j++) {
			printf("%d ", mat[i][j]);
		}
		printf("\n");
	}
}

void sums (int **mat, int m, int n) {
	for (int i = 0; i < m; i++) {
		int s = 0;
		for (int j = 0; j < n; j++) {
		 s += mat[i][j];
		}
		mat[i][n] = s;
	}
	
	for (int j = 0; j < n; j++) {
		int s = 0;
		for (int k = 0; k < m; k++) {
			s += mat[k][j];
		}
		mat[m][j] = s;
	} 
}

int sum (int **mat, int m, int n) {
	int s = 0;
	for (int i = 0; i < m; i++) {
		s += mat[i][n];
	}
	
	return s;
}

void optimize (int **mat, int m, int n) {
	sums(mat, m, n);
	int s = sum(mat, m, n);
	
	for (int i = 0; i < m; i++) {
		flip(mat, m, n, i, true);
		sums(mat, m, n);
		int sn = sum(mat, m, n);
		if (sn > s) {
			optimize(mat, m, n);
		} else {
			flip(mat, m, n, i, true);
		}
	}
	
	for (int j = 0; j < n; j++) {
		flip(mat, m, n, j, false);
		sums(mat, m, n);
		int sn = sum(mat, m, n);
		if (sn > s) {
			optimize(mat, m, n);
		} else {
			flip(mat, m, n, j, false);
		}
	}
}

int main (void) {
	FILE *in = fopen("flip.in", "r");
	FILE *out = fopen("flip.out", "w");
	
	int m, n;
	fscanf(in, "%d %d", &m, &n);
	
	int **mat = new int * [m+1];
	for (int i = 0; i < m + 1; i++) {
		mat[i] = new int[n+1];
	}
	
	for (int i = 0; i < m; i++) {
		for (int j = 0; j < n - 1; j++) {
			fscanf(in, "%d ", &mat[i][j]);
		}
		fscanf(in, "%d\n", &mat[i][n-1]);
	}
	
	optimize(mat, m, n);
	sums(mat, m, n);
	fprintf(out, "%d", sum(mat, m, n));
	
	return 0;
}