Cod sursa(job #2136590)

Utilizator ldd.man25Dogaru Mihai - Sorin ldd.man25 Data 19 februarie 2018 23:56:32
Problema Jocul Flip Scor 20
Compilator c Status done
Runda Arhiva de probleme Marime 2.13 kb
#include <stdlib.h> 
#include <stdio.h> 
#include <math.h> 

int** doBackup(int** tabla, int n, int m)
{
	int** backup = (int**)calloc(n, sizeof(int*)); 
	int i; 
	for(i = 0; i < n; i++){
		backup[i] = (int*)calloc(m, sizeof(int)); 
	}   

	int j; 

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

	return backup;

} 

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 apasaButoane2(int** backup, int* digits, int n, int m)
{
	int indexParcurgere = 0; 
	int j; 
	while(indexParcurgere < n + m){
		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 index = 0; 
	int* digits = (int*)calloc(n + m, sizeof(int)); 
	int nrButoane = n + m; 
	int** backup;
	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; 

		backup = doBackup(tabla, n, m); 
		apasaButoane2(backup, digits, n, m); 
		int x = calculeaza(backup, n, m); 
		if(x > max){
			max = x;  
		}

		freeBackup(backup, n); 
		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; 
	tabla = (int**)calloc(n, sizeof(int*)); 
	
	for(i = 0; i < n; i++){
		tabla[i] = (int*)calloc(m, sizeof(int)); 
	}
	for(i = 0; i < n; i++){
		for(j = 0; j < m; j++){
			fscanf(input, "%i", &(tabla[i][j]) );
		}
	} 

	findMax2(tabla, n, m);

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