Cod sursa(job #340291)

Utilizator sterepavelStere Pavel sterepavel Data 14 august 2009 01:15:07
Problema Jocul Flip Scor 20
Compilator c Status done
Runda Arhiva de probleme Marime 2.15 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 sum = 0 ;
	int i, j;
	Matrix mat;
	int cols[16] = {0 ,0 ,0 ,0 ,0 ,0 ,0 ,0 ,0 ,0 ,0 ,0 ,0 ,0 ,0 ,0};
	int lines[16] = {0 ,0 ,0 ,0 ,0 ,0 ,0 ,0 ,0 ,0 ,0 ,0 ,0 ,0 ,0 ,0};

	read_data( &mat );
	sum = matrix_sum( &mat );

	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( sum );
	return 0;
}