Cod sursa(job #1790626)

Utilizator octavyan55Aurel Savoiu octavyan55 Data 28 octombrie 2016 15:44:05
Problema Jocul Flip Scor 10
Compilator c Status done
Runda Arhiva de probleme Marime 2.04 kb
#include <stdlib.h>
#include <stdio.h>

int max_sum = 0;

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

void flip_row(int** matrix, int n, int m, int r)
{
	int i;
	for (i = 0 ; i < m ; i++ )
	{	
			matrix[r][i] = -matrix[r][i];
	}
}

void flip_col(int** matrix, int n, int m, int c)
{
	int i;	
	for (i = 0 ; i < n ; i++ )
	{
			matrix[i][c] = -matrix[i][c];
	}
}

int max (int a, int b)
{
	if (a > b)
		return a;
	return b;
}

void backtrack_col(int** matrix, int n, int m, int sum, int k)
{
	int tmp_sum;
	max_sum = max(sum, max_sum);		
	if (k == n) {
		return;
	}
	else
	{
		
		// Continue backtracking
		backtrack_col(matrix, n, m, sum, k + 1);
		
		flip_col(matrix, n, m, k);
		backtrack_col(matrix, n, m, matrix_sum(matrix, n, m), k + 1);		
	}
}

void backtrack_row (int** matrix, int n, int m, int sum, int k)
{
	int tmp_sum;
	max_sum = max(sum, max_sum);
	if (k == n ) {
		return;
	}
	else
	{		
		// Do backtracking for the columns
		backtrack_col(matrix, n, m, sum, 0);		
		
		flip_row(matrix, n, m, k);
		backtrack_col(matrix, n, m, matrix_sum(matrix, n, m), 0);
		flip_row(matrix, n, m, k);
		
		// Continue backtracking
		backtrack_row(matrix, n, m, sum, k + 1);
		
		flip_row(matrix, n, m, k);
		backtrack_row(matrix, n, m, matrix_sum(matrix, n, m), k + 1);
	}
}

int main(int argc, char** argv)
{
	int n, m, i, j, sum;
	int **matrix;
	
	FILE *in, *out;
	
	in = fopen("flip.in", "r");
	out = fopen("flip.out", "w");
	
	fscanf(in, "%d %d", &n, &m);
	
	matrix = malloc( n * sizeof( int* ) );
	for (i = 0 ; i < n ; i++ )
		matrix[i] = malloc( m * sizeof( int ) );
	
	for (i = 0 ; i < n ; i++ )
		for (j = 0 ; j < m ; j++ )
			fscanf(in, "%d", &matrix[i][j]);
	
	sum = matrix_sum(matrix, n, m);
	
	max_sum = sum;
	
	backtrack_row(matrix, n, m, sum, 0);
	
	printf("%d\n", max_sum);
	fprintf(out, "%d", max_sum);
	
	fclose(in);
	fclose(out);
}