Cod sursa(job #2000185)

Utilizator JohnnyKiteFlorin Smeu JohnnyKite Data 12 iulie 2017 20:51:17
Problema Jocul Flip Scor 20
Compilator c Status done
Runda Arhiva de probleme Marime 1.52 kb
#include <stdio.h>
#include <stdlib.h>

int main(void) 
{
	int n, m, i, j, k, s = 0, sum = 0;
	
	FILE *f, *g;
	f = fopen("flip.in", "rt");
	fscanf(f, "%d %d", &n, &m);
	
	int** mat = malloc(n * sizeof(int*));
	for (i = 0; i < n; i++) {
		mat[i] = malloc(m * sizeof(int));
	}
	
	for (i = 0; i < n; i++) {
		for (j = 0; j < m; j++) {
			fscanf(f, "%d ", &mat[i][j]); 
		}
	}
	
	fclose(f);
	g = fopen("flip.out", "wt");
	
	//flip
	if (m >= n) {
		//max flip
		for (i = 0; i < n; i++) {
			for (j = 0; j < m; j++) {
				s += mat[i][j];
			}
			if (s < 0) {
				for (k = 0; k < m; k++) {
					mat[i][k] = mat[i][k] - 2 * mat[i][k];
				}
			}
			s = 0;
		}
		//min flip
		for (j = 0; j < m; j++) {
			for (i = 0; i < n; i++)	{
				s += mat[i][j];
			}
			if (s < 0) {
				for (k = 0; k < n; k++) {
					mat[k][j] = mat[k][j] - 2 * mat[k][j];
				}
			}
			s = 0;	
		}		
	} else {
		//max flip
		for (j = 0; j < m; j++) {
			for (i = 0; i < n; i++)	{
				s += mat[i][j];
			}
			if (s < 0) {
				for (k = 0; k < n; k++) {
					mat[k][j] = mat[k][j] - 2 * mat[k][j];
				}
			}
			s = 0;	
		}		
		//min flip
		for (i = 0; i < n; i++) {
			for (j = 0; j < m; j++) {
				s += mat[i][j];
			}
			if (s < 0) {
				for (k = 0; k < m; k++) {
					mat[i][k] = mat[i][k] - 2 * mat[i][k];
				}
			}
			s = 0;
		}
	}				
	
	//compute maximum sum
	for (i = 0; i < n; i++) {
		for (j = 0; j < m; j++) {
			sum += mat[i][j];
		}
	}
	
	//write result
	fprintf(g, "%d ", sum);
	fclose(g);
	
	//free memory
	for (i = 0; i < n; i++) {
		free(mat[i]);
	}
	free(mat);
	
	return 0;
}