Cod sursa(job #542493)

Utilizator laurionLaurentiu Ion laurion Data 26 februarie 2011 14:19:03
Problema Pixels Scor 0
Compilator cpp Status done
Runda Romanian Master in Mathematics and Sciences 2011, Ziua 2 Marime 1.85 kb
#include<cstdio>
#include<iostream>
const int 	lin[4]={-1,0,1, 0},
			col[4]={0, 1,0,-1};
struct pix
{
	int cul[2],c[4];
	bool px;//0=alb,1=negru
};
int n;
pix v[100][100]={0};

int max=0;
inline void Cost(int& cost)
{
	cost=0;
	register int i,j;
	for(i=0;i<n;++i)
	{
		for(j=0;j<n;j+=2)
			if(v[i][j].px!=v[i+1][j].px)
				cost+=v[i][j].c[2];
		for(j=1;j<n;j+=2)
		{
			if(v[i][j].px!=v[i][j+1].px)
				cost+=v[i][j].c[1];
			if(v[i][j].px!=v[i+1][j].px)
				cost+=v[i][j].c[2];
			if(v[i][j].px!=v[i][j-1].px)
				cost+=v[i][j].c[3];
			
		}		
	}
	//poz pare->calc pt vecinii din stg + dr + jos
	//poz imp->calc pt vecinul de jos doar
}
inline void Pleasure(int& placere)
{
	placere=0;
	register int i,j;
	for(i=0;i<n;++i)
		for(j=0;j<n;++j)
			placere+=v[i][j].cul[v[i][j].px];
	
	int cost;
	Cost(cost);
	placere-=cost;
}
inline void back(int ki,int kj)
{
	if(kj>=n)
		kj=0,ki++;
	if (ki>=n)
	{
		int pl;
		Pleasure(pl);
		if(pl>max)
			max=pl;
		return;
	}
	register int i,j,ii,jj;
	for(i=ki;i<n;++i)
	{
		for(j=kj;j<n;++j)
		{
			back(i,j+1);
			for(jj=j+1;jj<n;++jj)
				v[i][jj].px=0;
			for(ii=i+1;ii<n;++ii)
				for(jj=0;jj<n;++jj)
					v[ii][jj].px=0;
			v[i][j].px=1;
			back(i,j+1);
			
			for(jj=j+1;jj<n;++jj)
				v[i][jj].px=0;
			for(ii=i+1;ii<n;++ii)
				for(jj=0;jj<n;++jj)
					v[ii][jj].px=0;
		}
	}
	
}

int main()
{
	
	freopen("pixels.in","r",stdin);
	freopen("pixels.out","w",stdout);
	
	
	scanf("%d",&n);
	
	memset(v,0,sizeof(v));
	register int i,j,k;
	for( i=0;i<n;++i)
		for( j=0;j<n;++j)
			scanf("%d",&v[i][j].cul[0]);
	
	
	for( i=0;i<n;++i)
		for( j=0;j<n;++j)
			scanf("%d",&v[i][j].cul[1]);
	
	
	for( i=0;i<n;++i)
		for( j=0;j<n;++j)
			for( k=0;k<4;++k)
				scanf("%d",&v[i][j].c[k]);
	
	
	
	back(0,0);
	
	printf("%d\n",max);
	
	
	return 0;
}