Cod sursa(job #124628)

Utilizator saululflorin saulul Data 19 ianuarie 2008 18:00:19
Problema Jocul Flip Scor 30
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.19 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);
	}

int final(int p)
	{
	if (p==n+m) return 1;
	return 0;
	}

void minus(int l,int c)
	{
	if (l!=-1)
		for(int i=0;i<m;i++)
			a[l][i]=-a[l][i];
	if (c!=-1)
		for(int i=0;i<n;i++)
			a[i][c]=-a[i][c];
	}

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;


	}
void calculeaza()
	{
	int l,c;
	l=c=-1;
	for(int i=0;i<n+m;i++)
		if(st[i]==1)
			{
			if(i<n)
					l=i;
			else c=i-n;
			minus(l,c);
			}
	actualizeaza();
	}



void backtrk(int p)
	{
	for(int k=0;k<2;k++)
		{
		st[p]=k;
			if (final(p))
				{
				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();
	}