Cod sursa(job #340294)

Utilizator sterepavelStere Pavel sterepavel Data 14 august 2009 01:49:39
Problema Jocul Flip Scor 100
Compilator c Status done
Runda Arhiva de probleme Marime 2.64 kb
#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>
#include <stdlib.h>

typedef struct _Matrix{
	int n;
	int m;
	int data[16][16];
} Matrix;

void read_data( Matrix *matrix )
{
	int i, j;

	FILE *f = fopen( "flip.in", "r" );
	fscanf( f, "%i%i", &matrix->n, &matrix->m );

	for ( i = 0; i < matrix->n; i++ )
		for ( j = 0; j < matrix->m; j++ )
			fscanf( f, "%i", &matrix->data[i][j] );
}

void write_response( int response )
{
	FILE *f = fopen( "flip.out", "w" );
	fprintf( f, "%i", response );
}

int matrix_sum( Matrix *matrix )
{
	int sum = 0;
	int i, j;

	for ( i = 0; i < matrix->n; i++ )
		for ( j = 0; j < matrix->m; j++ )
			sum += matrix->data[i][j];

	return sum;
}

int matrix_sum_line( Matrix *mat, int line )
{
	int sum = 0;
	int k;

	for ( k = 0 ; k < mat->m; k++ )
		sum += mat->data[line][k];

	return sum;
}

int matrix_sum_column( Matrix *mat, int column )
{
	int sum = 0;
	int k;

	for ( k = 0 ; k < mat->n; k++ )
		sum += mat->data[k][column];

	return sum;
}


int main()
{
	//int max_sum = 0;
	int smax = 0, s = 0, t = 0 ;
	int i, j, k;
	Matrix mat;

	read_data( &mat );
	for(i=0;i<(1<<mat.m);i++)  
	{  
		s=0;  
		for(k=0;k<mat.n;k++)  
		{  
			for(t=j=0;j<mat.m;j++)  
				if(i&(1<<j))  
					t+=-mat.data[k][j];  
				else  
					t+=mat.data[k][j];  
			if(t>-t)  
				s+=t;  
			else  
				s+=-t;  
		}  
		if(s>smax)  
			smax=s;  
	}  

	/*
	for ( j = 0; j < (1 << mat.m); j++ ) {
		int this_sum = 0;
		for ( k = 0; k < mat.m; k++ ) {
			int tt = 0;
			for ( i = 0; i < mat.n; i++ ) {
				tt += (( (1 < k) & j )? 1 : -1) * mat.data[i][k];
			}
			if ( tt > 0 )
				this_sum += tt;
			else 
				this_sum -= tt;
		}
		if ( sum < this_sum )
			sum =this_sum;
	}
	*/
/*
	for ( ;; ) {
		int win_line = 0, win_col = 0;


		for ( i = 0; i < mat.n; i++ )
			lines[i] = matrix_sum_line( &mat, i );
		for ( i = 0; i < mat.m; i++ )
			cols[i] = matrix_sum_column( &mat, i );


		for ( i = 0; i < mat.n; i++ )
			if ( lines[i] < 0 )
				win_line += - lines[i];
		for ( i = 0; i < mat.m; i++ )
			if ( cols[i] < 0 )
				win_col += - cols[i];


		if ( win_line <= 0 && win_col <= 0 )
			break ;

		if ( win_line >= win_col ) {
			for ( i = 0; i < mat.n; i++ ) {
				if ( lines[i] < 0 ) {
					for ( j = 0; j < mat.m; j++ )
						mat.data[i][j] *= -1;
				}
			}
			sum += 2 * win_line;
		}

		if ( win_col > win_line ) {
			for ( j = 0; j < mat.m; j++ ) {
				if ( cols[j] < 0 ) {
					for ( i = 0; i < mat.n; i++ )
						mat.data[i][j] *= -1;
				}
			}
			sum += 2* win_col;
		}

	}

	*/
	write_response( smax );
	return 0;
}