Cod sursa(job #349632)

Utilizator ChallengeMurtaza Alexandru Challenge Data 20 septembrie 2009 18:18:24
Problema Jocul Flip Scor 30
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.52 kb
#include <stdio.h>

int n, m, mat[17][17], max;

struct dint{
	int m,p;
};

void Read(){
	FILE *f;
	int i=0,j=0;
	f = fopen("flip.in","r");
	fscanf(f,"%d %d",&n,&m);
	for(i = 0;i<n;++i)
	{
		for(j=0;j<m;++j)
		{
			fscanf(f,"%d",&mat[i][j]);
		}
	}
	fclose(f);
}

void Write(){
	FILE *f;
	f = fopen("flip.out","w");
	fprintf(f,"%d",max);
	fclose(f);
}

int abs(int a){
	if(a>0){return a;}
	return -a;
}

dint GetCol(int col){
	dint rez;
	rez.p = 0;
	rez.m = 0;
	for(register int i = 0;i<n;++i)
	{
		if(mat[i][col]>0){rez.p+=mat[i][col];}
		else{rez.m+=abs(mat[i][col]);}
	}
	return rez;
}

void SwC(int col){
	for(register int i=0;i<n;++i)
	{
		mat[i][col]=-mat[i][col];
	}
}

void SwCol(int col){
	dint t;
	t = GetCol(col);
	if(t.m>t.p){SwC(col);}
}

void SwColA(){
	for(register int i = 0;i<m;++i)
	{
		SwCol(i);
	}
}

dint GetLin(int lin){
	dint t;
	t.m = 0;
	t.p = 0;
	for(register int i = 0;i<m;++i)
	{
		if(mat[lin][i]>0){t.p+=mat[lin][i];}
		else{t.m+=abs(mat[lin][i]);}
	}
	return t;
}

void SwL(int lin){
	for(register int i = 0;i<m;++i)
	{
		mat[lin][i]=-mat[lin][i];
	}
}

void SwLin(int lin){
	dint t;
	t = GetLin(lin);
	if(t.m>t.p){SwL(lin);}
}

void SwLinA(){
	for(register int i = 0;i<n;++i)
	{
		SwLin(i);
	}
}

int GetMatSum()
{
	int ret=0;
	int i,j;
	for(i=0;i<n;++i)
	{
		for(j=0;j<m;++j)
		{
			ret+=mat[i][j];
		}
	}
	return ret;
}

int main(){
	Read();
	SwColA();
	SwLinA();
	max=GetMatSum();
	Write();
	return 0;
}