Cod sursa(job #543812)

Utilizator AndrewTheGreatAndrei Alexandrescu AndrewTheGreat Data 28 februarie 2011 17:06:14
Problema Pixels Scor 0
Compilator cpp Status done
Runda Arhiva de probleme Marime 2.4 kb
#include <iostream>
#include <stdio.h>


using namespace std;

int N;
const int nmax = 101;
int what[nmax][nmax], C[nmax * nmax][4], cul[2][nmax][nmax], affair[nmax][nmax];

void read()
{
    freopen ("pixels.in","r",stdin);
    freopen ("pixels.out","w",stdout);
    scanf("%d",&N);
    int k, i, j;
    for(k = 0; k < 2; k++)
        for(i = 1; i <= N; i++)
            for(j = 1; j <= N; j++)
                scanf("%d",&cul[k][i][j]);

    for(i = 1; i <= N * N; i++)
        scanf("%d %d %d %d",&C[i][0],&C[i][1],&C[i][2],&C[i][3]);

}

int di[4] = {-1,0,+1,0},
    dj[4] = {0,+1,0,-1};

void initial()
{
    int i, j;
    for(i = 1; i <= N; i++)
        for(j = 1; j <= N; j++)
            if(cul[0][i][j] < cul[1][i][j])
                what[i][j] = 1;
}

int total()
{
    int tot = 0;
    int i, j, k, x;
    for(i = 1; i <= N; i++)
        for(j = 1; j <= N; j++)
        {
            x = cul[what[i][j]][i][j];
            for(k = 1; k < 3; k++)
                if(what[i][j] != what[i + di[k]][j + dj[k]])
                    x -= C[(i - 1) * N + j][k];
            tot += x;
        }
    return tot;
}

int maxnou;

int actual(int i, int j, int col)
{
    int k;
    int c = cul[col][i][j];
    for(k = 0; k <= 3; k++)
        if(col != what[i + di[k]][j + dj[k]])
            c -= C[(i - 1) * N + j][k];
    return c;
}

void solve()
{
    int i, j, cat, dif, isw, jsw;
    for(i = 1; i <= N; i++)
        for(j = 1; j <= N; j++)
            affair[i][j] = actual(i, j, what[i][j]);

    while(true)
    {
        cat = 0;
        for(i = 1; i <= N; i++)
            for(j = 1; j <= N; j++)
            {
                dif = actual(i, j, 1 - what[i][j]);
                if(dif > affair[i][j])
                    if( cat < dif - affair[i][j])
                    {
                        cat = dif - affair[i][j];
                        isw = i;
                        jsw = j;
                    }
            }

        if(cat > 0)
        {
            what[isw][jsw] = 1 - what[isw][jsw];
            affair[i][j] = actual(isw, jsw, what[isw][jsw]);
        }
        else break;
    }

    printf("%d\n",total());
    for(i = 1; i <= N; i++)
    {
        for(j = 1; j <= N; j++)
            printf("%d ", what[i][j]);
        printf("\n");
    }
}


int main()
{
    read();
    initial();
    solve();
    return 0;
}