Cod sursa(job #2139410)

Utilizator ldd.man25Dogaru Mihai - Sorin ldd.man25 Data 22 februarie 2018 15:31:29
Problema Jocul Flip Scor 100
Compilator c Status done
Runda Arhiva de probleme Marime 2.56 kb
#include <stdlib.h> 
#include <stdio.h> 
#include <math.h> 

void overWrite(int** tabla, int** tablaBackup, int n, int m)
{
	int i, j;
	for(i = 0; i < n; i++){
		for(j = 0; j < m; j++){
			tabla[i][j] = tablaBackup[i][j]; 
		}
	} 

}

void freeBackup(int** backup, int n)
{
	int i; 
	for(i = 0; i < n; i++){
		free(backup[i]); 
	} 

	free(backup);  
}  

int calculeaza(int** tabla, int n, int m)
{
	int s = 0; 
	int i,j; 

	for( i = 0; i < n; i++){
		for(j = 0; j < m; j++){
			s += tabla[i][j]; 
		}
	} 

	return s; 
} 

void rezolvaColoanele(int** tabla, int n, int m){
	int suma = 0; 
	int sumaPeMinus = 0; 

	int i, j; 

	for(j = 0; j < m; j++){
		suma = 0; 
		sumaPeMinus = 0; 
		for(i = 0; i < n; i++){
			suma += tabla[i][j]; 
			sumaPeMinus += (-tabla[i][j]); 
		}
		if(sumaPeMinus > suma){
			for(i = 0; i < n; i++){
				tabla[i][j] = (-tabla[i][j]); 
			}
		}
	} 

} 

void apasaButoane2(int** backup, int* digits, int n, int m)
{
	int indexParcurgere = 0; 
	int j; 
	while(indexParcurgere < n){
		if(digits[indexParcurgere] != 0){
			if(indexParcurgere < n){
				for(j = 0; j < m; j++){
					backup[indexParcurgere][j] *= (-1); 
				}
			} 
			else{
				for(j = 0; j < n; j++){
					backup[j][indexParcurgere - n] *= (-1); 
				}
			}
		} 
		indexParcurgere++; 
	}
}

void findMax2(int** tabla, int n, int m, int** tablaBackup)
{
	int index = 0; 
	int* digits = (int*)calloc(n, sizeof(int)); 
	int nrButoane = n; 
	
	int max = calculeaza(tabla, n, m);  

	index = 1; 
	int i; 

	int nrCaz = pow(2, nrButoane); 
	while(index != nrCaz){
		i = 0; 
		while(digits[i] == 1 && i <= (nrButoane - 1) ){
			digits[i++] = 0; 
		}
		digits[i] = 1; 		 
		apasaButoane2(tabla, digits, n, m); 
		rezolvaColoanele(tabla, n, m); 
		int x = calculeaza(tabla, n, m); 
 
		overWrite(tabla, tablaBackup, n, m); 
		if(x > max){
			max = x; 
		}

		index++; 
	} 

	
	FILE* output = fopen("flip.out", "a"); 
	fprintf(output, "%i", max); 
	free(digits);
	fclose(output); 
}

int main()
{
	int n, m; 
	FILE* input; 

	input = fopen("flip.in", "r"); 
	 

	int i, j; 

	fscanf(input, "%i", &n); 
	fscanf(input, "%i", &m);  

	int** tabla; 
	int** tablaBackup; 
	tablaBackup = (int**)calloc(n, sizeof(int*)); 
	tabla = (int**)calloc(n, sizeof(int*)); 
	
	for(i = 0; i < n; i++){
		tabla[i] = (int*)calloc(m, sizeof(int)); 
		tablaBackup[i] = (int*)calloc(m, sizeof(int));
	}
	for(i = 0; i < n; i++){
		for(j = 0; j < m; j++){
			fscanf(input, "%i", &(tabla[i][j]) );
			tablaBackup[i][j] = tabla[i][j];
		}
	} 

	findMax2(tabla, n, m, tablaBackup);

	freeBackup(tabla, n);
	freeBackup(tablaBackup, n); 
	fclose(input); 
	   
	return 0;
}