Cod sursa(job #124666)

Utilizator saululflorin saulul Data 19 ianuarie 2008 18:45:26
Problema Jocul Flip Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.24 kb
#include <stdio.h>
#define MAX 16

int m,n;
long a[MAX][MAX], suma_max;
int st[2*MAX];

void citire()
	{
	FILE *fin;
	fin=fopen("flip.in","rt");
	fscanf(fin,"%d %d",&n,&m);
	for(int i=0;i<n;i++)
		for(int j=0;j<m;j++)
			fscanf(fin,"%ld",&a[i][j]);
	fclose(fin);
	}


void flip_col(int c)
	{
	for(int i=0;i<n;i++)
			a[i][c]=-a[i][c];
	}

void flip_lin(int l)
	{
	for(int i=0;i<m;i++)
			a[l][i]=-a[l][i];
	}

void actualizeaza()
	{
	long suma_curenta=0;
	for(int i=0;i<n;i++)
		for(int j=0;j<m;j++)
			suma_curenta+=a[i][j];

	if (suma_curenta>suma_max) 
				suma_max=suma_curenta;


	}

long int suma_lin(int l)
	{
	long int aux=0;
	for(int i=0;i<m;i++)
			aux+=a[l][i];
	return aux;
	
	}
void calculeaza()
	{
	for(int i=0;i<m;i++)
		if(st[i]==1)
			{
			flip_col(i);
			}
	for(int i=0;i<n;i++)
		if (suma_lin(i)<0)
			flip_lin(i);
	actualizeaza();
	}



void backtrk(int p)
	{
	for(int k=0;k<2;k++)
		{
		st[p]=k;
			if (p==m)
				{
				calculeaza();
				}
			else
				backtrk(p+1);
		}
	}


void afis()
	{
	FILE *fout;
	fout=fopen("flip.out","wt");
	fprintf(fout,"%ld",suma_max);
	fclose(fout);
	}

int main()
	{
	suma_max=-256000000;
	citire();
	backtrk(1);
	afis();
	}