Cod sursa(job #47504)

Utilizator znakeuJurba Andrei znakeu Data 3 aprilie 2007 19:22:44
Problema Jocul Flip Scor 40
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.11 kb
#include <stdio.h>
int sc[17],sl[17],v[17][17],m,n,sm;

void serci(int k,int scr)
{
	int i;
	if (k>m+n-2 && scr>sm)
		sm=scr;
	if (k<n)
	{
		// leave it be!
		serci(k+1,scr);
		// invert the damned thingy!
		for (i=0; i<m; i++)
		{
			sc[i]-=2*v[k][i];
			v[k][i]=-v[k][i];
		}
		sl[k]=-sl[k];
		serci(k+1,scr+2*sl[k]);
		for (i=0; i<m; i++)
		{
			sc[i]-=2*v[k][i];
			v[k][i]=-v[k][i];
		}
		sl[k]=-sl[k];
	}
	
	if (k>=n && k<=m+n-2)
	{
		// leave it be!
		serci(k+1,scr);
		// invert the damned thingy!
		for (i=0; i<n; i++)
		{
			sl[i]-=2*v[i][k-n];
			v[i][k-n]=-v[i][k-n];
		}
		sc[k-n]=-sc[k-n];
		serci(k+1,scr+2*sc[k-n]);
		for (i=0; i<n; i++)
		{
			sl[i]-=2*v[i][k-n];
			v[i][k-n]=-v[i][k-n];
		}
		sc[k-n]=-sc[k-n];
	}
}


int main()
{
	int i,j;
	FILE *in=fopen("flip.in","r");
	fscanf(in,"%d%d",&n,&m);
	for (i=0; i<n; i++)
		for (j=0; j<m; j++)
		{
			fscanf(in,"%d",&v[i][j]);
			sl[i]+=v[i][j];
			sc[j]+=v[i][j];
			sm+=v[i][j];
		}
	fclose(in);
	
	serci(0,sm);
	
	FILE *out=fopen("flip.out","w");
	fprintf(out,"%d\n",sm);
	fclose(out);
	return 0;
}