Cod sursa(job #1337737)

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

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

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 **buffer, int m, int n) {
	sums(mat, m, n);
	int s = sum(mat, m, n);
	
	for (int i = 0; i < m+1; i++) {
		memcpy(buffer[i], mat[i], (n+1) * sizeof(int));
	}
//	print(buffer, m+1, n+1);	
//	printf("\n");
	
	for (int i = 0; i < m; i++) {
		for (int j = 0; j < n; j++) {
			flip(mat, m, n, i, j);
			sums(mat, m, n);
			int sn = sum(mat, m, n);
			if (sn > s) {
				optimize(mat, buffer, m, n);
			} else {
				for (int k = 0; k < m+1; k++) {
					memcpy(mat[k], buffer[k], (n+1) * sizeof(int));
				}
			}
		}
	}
}		

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];
	}
	
	int **buffer = new int * [m+1];
	for (int i = 0; i < m + 1; i++) {
		buffer[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, buffer, m, n);
	int s = sum(mat, m, n);
	fprintf(out, "%d", s);
	
	fclose(in);
	fclose(out);
	
	for (int i = 0; i < m + 1; i++) {
		delete []mat[i];
	}
	delete []mat;
	
	return 0;
}