Cod sursa(job #744483)

Utilizator petrePajarcu Alexandru-Petrisor petre Data 8 mai 2012 20:25:33
Problema Jocul Flip Scor 30
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.22 kb
#include<stdio.h>
int K,oriz[20],vert[20],m[20][20],kk[20][20],OK,i,j,M,n,max;
void transform()
{
	for(int u=1;u<=n;++u)
	{
		if(oriz[u])
		{
			for(int h=1;h<=M;++h)
			{
				m[u][h]=-m[u][h];
			}
		}
	}
	for(int u=1;u<=M;++u)
	{
		if(vert[u])
		{
			for(int h=1;h<=n;++h)
			{
				m[h][u]=-m[h][u];
			}
		}
	}
}
void findout ()
{
	int S=0;
	for(int u=1;u<=n;++u)
		for(int h=1;h<=M;++h)
			S+=m[u][h];
	if(S>max)
		max=S;
}
void restore ()
{
	for(int u=1;u<=n;++u)
		for(int h=1;h<=M;++h)
			m[u][h]=kk[u][h];
}
int main ()
{
	freopen("flip.in","r",stdin);
	freopen("flip.out","w",stdout);
	scanf("%d%d",&n,&M);
	for(i=1;i<=n;++i)
		for(j=1;j<=M;++j)
		{
			scanf("%d",&m[i][j]);
			kk[i][j]=m[i][j];
		}
	i=1;OK=1;K=1;
	findout();
	while(OK)
	{i=1;
	OK=0;
	while(i<=n)
	{
		if(oriz[i]==0)
		{
			OK=1;
			oriz[i]=1;
			j=1;
			K=1;
			while(K)
			{j=1;
			K=0;
			while(j<=M)
			{
				if(vert[j]==0)
				{
					K=1;
					vert[j]=1;
					transform ();
					findout ();
					restore ();
					break;
				}
				else
				{
					vert[j]=0;
					++j;
				}
			}
			}
			break;
		}
		else
		{
			oriz[i]=0;
			++i;
		}
	}
	}
	printf("%d",max);
	return 0;
}