Cod sursa(job #542355)

Utilizator robigiirimias robert robigi Data 26 februarie 2011 12:17:30
Problema Pixels Scor 10
Compilator cpp Status done
Runda Romanian Master in Mathematics and Sciences 2011, Ziua 2 Marime 1.29 kb
#include <cstdio>

using namespace std;

FILE *f=fopen("pixels.in", "r");
FILE *g=fopen("pixels.out", "w");

int n;
int a[101][101];
int b[101][101];
int c[101][101][4];
int kx[4]={-1, 0, 1, 0};
int ky[4]={0, 1, 0, -1};
int v[101][101];
int max=-1;

void read()
{
	fscanf(f, "%d", &n);
	int i=1, j=1;
	for (i=1; i<=n; ++i)
		for (j=1; j<=n; ++j)
			fscanf(f, "%d", &a[i][j]);
	for (i=1; i<=n; ++i)
		for (j=1; j<=n; ++j)
			fscanf(f, "%d", &b[i][j]);
	for (i=1; i<=n; ++i)
		for (j=1; j<=n; ++j)
			for (int k=0; k<4; ++k)
				fscanf(f, "%d", &c[i][j][k]);
}

int maxim(int x, int y)
{
	if (x>y) return x;
	return y;
}

void afis()
{
	int sum=0;
	for (int i=1; i<=n; ++i)
		for (int j=1; j<=n; ++j)
		{
			if (v[i][j]==1)
				sum+=a[i][j];
			else sum+=b[i][j];
			for (int k=1; k<3; ++k)
			{
				if (v[i][j]!=v[i+kx[k]][j+ky[k]])
					sum-=c[i][j][k];
			}
		}
	max=maxim(max, sum);
}


void program(int i, int j)
{
	v[i][j]=1;
	if (j<n)
		program(i, j+1);
	else
	{
		if (i<n)
			program(i+1,1);
		else afis();
	}
	v[i][j]=2;
	if (j<n)
		program(i, j+1);
	else
	{
		if (i<n)
			program(i+1,1);	
		else afis();
	}
	
}


int main()
{	
	read();
	
	program(1, 1);
	
	fprintf(g, "%d", max);
	
	fclose(f);
	fclose(g);
	
	return 0;
}