Cod sursa(job #542392)

Utilizator DraStiKDragos Oprica DraStiK Data 26 februarie 2011 12:54:36
Problema Pixels Scor 10
Compilator cpp Status done
Runda Romanian Master in Mathematics and Sciences 2011, Ziua 2 Marime 1.44 kb
#include <algorithm>
using namespace std;

#define DIM 105
#define MAX 4

int a[DIM][DIM],b[DIM][DIM],c[DIM][DIM][4];
bool val[DIM][DIM];
int nr[DIM];
int N,nrt;

void read ()
{
    int i,j,k;

    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=0; k<MAX; ++k)
            scanf ("%d",&c[i][j][k]);
}

inline void check_sol ()
{
    int i,j,nrc;

    nrc=0;
    for (i=1; i<=N; ++i)
        for (j=1; j<=N; ++j)
        {
            if (nr[i]&(1<<(j-1)))
                val[i][j]=1;
            else
                val[i][j]=0;

            if (val[i][j])
                nrc+=a[i][j];
            else
                nrc+=b[i][j];

            if (val[i][j]!=val[i-1][j])
                nrc-=c[i][j][0];
            if (val[i][j]!=val[i][j-1])
                nrc-=c[i][j][3];
        }
    nrt=max (nrt,nrc);
}

void back (int linie)
{
    int i;

    if (linie==N+1)
        check_sol ();
    else
        for (i=0; i<(1<<N); ++i)
        {
            nr[linie]=i;
            back (linie+1);
        }
}


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

    read ();
    back (1);
    printf ("%d",nrt);

    return 0;
}