Cod sursa(job #542464)

Utilizator laurionLaurentiu Ion laurion Data 26 februarie 2011 13:58:04
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};
bool rez[100][100];
int max=0;
inline void Cost(int& cost)
{
	cost=0;
	for(register int i=0;i<n;++i)
	{
		for(register int j=0;j<n;j+=2)
			if(v[i][j].px!=v[i+1][j].px)
				cost+=v[i][j].c[2];
		for(register int 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;
	for(register int i=0;i<n;++i)
		for(register int 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;
	}
	for(register int j=kj;j<n;++j)
		v[ki][j].px=0;
	for(register int i=ki+1;i<n;++i)
		for(register int j=0;j<n;++j)
			v[i][j].px=0;
	for(register int i=ki;i<n;++i)
	{
		for(register int j=kj;j<n;++j)
		{
			back(i,j+1);
			v[i][j].px=1;
			back(i,j+1);
		}
	}
	
}

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