Cod sursa(job #542555)

Utilizator blastoiseZ.Z.Daniel blastoise Data 26 februarie 2011 14:54:52
Problema Pixels Scor 10
Compilator cpp Status done
Runda Romanian Master in Mathematics and Sciences 2011, Ziua 2 Marime 1.17 kb
#include <stdio.h>

int A[10][10],B[10][10],C[10][10][7];

int sol[200];

int i,j,k,N,max;

inline int verif()
{
	int a,b,c;
	int i,j,k;
	int v[10][10];

	a=0;
	b=0;
	c=0;

	k=0;

	for(i=1;i<=N;i++)
		for(j=1;j<=N;j++)
			v[i][j]=sol[++k];

	for(i=1;i<=N;i++)
		for(j=1;j<=N;j++)
			if(v[i][j]==0) a+=A[i][j];
			else if(v[i][j]==1) b+=B[i][j];

	for(i=1;i<=N;i++)
		for(j=1;j<=N;j++)
		{
			if(v[i][j]!=v[i-1][j]) c+=C[i][j][1];
			if(v[i][j]!=v[i][j+1]) c+=C[i][j][2];
			if(v[i][j]!=v[i+1][j]) c+=C[i][j][3];
			if(v[i][j]!=v[i][j-1]) c+=C[i][j][4];
		}

	c/=2;

	return a+b-c;
}

inline void back(int k)
{
	int i,aux;

	if(k>N*N)
	{
		aux=verif();
		if(aux>max) max=aux;
	}
	else
	for(i=0;i<=1;i++)
	{
		sol[k]=i;
		back(k+1);
	}
}

int main()
{
	freopen("pixels.in","r",stdin);
	freopen("pixels.out","w",stdout);

	scanf("%d",&N);

	for(i=1;i<=N;i++)
		for(j=1;j<=N;j++)
			scanf("%d",&A[i][j]);

	for(i=1;i<=N;i++)
		for(j=1;j<=N;j++)
			scanf("%d",&B[i][j]);

	for(i=1;i<=N;i++)
		for(j=1;j<=N;j++)
			for(k=1;k<=4;k++)
				scanf("%d",&C[i][j][k]);

	max=0;
	back(1);

	printf("%d\n",max);

	return 0;
}