Cod sursa(job #51580)

Utilizator pustiuRadu Zaharia pustiu Data 15 aprilie 2007 11:00:05
Problema Jocul Flip Scor 40
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.45 kb
#include<stdio.h>

int N, M, A[17][17], F[33];
long S=-16000000;

int calc ()
{
    int x=0;
    for(int i=1;i<=N;i++)
        for(int j=1;j<=M;j++)
            x+=A[i][j];
    return x;
}

void flip (int y)
{
    if(y<=N)
        for(int i=1;i<=M;i++)
            A[y][i]=-A[y][i];
    else
        for(int i=1;i<=N;i++)
            A[i][y-N]=-A[i][y-N];
}

void flp()
{
    for(int j=1;j<=M;j++)
    {
        int s=0;
        for(int l=1;l<=N;l++)
            s+=A[l][j];
        if(s<0)
            flip(N+j);
    }
}

void back (int k)
{
    int s=calc();
    if(s>S)
        S=s;
    if(k<=N+M)
    {
        for(int i=0;i<=1;i++)
        {
            if (!i)
            {
                if(k>5)
                    s++;
                flip(k);
                F[k]=1;
            }
            if(F[3]==1 && F[7]==1)
                s++;
            //flp();
            back(k+1);
            if (!i)
            {
                flip(k);
                F[k]=0;
            }
        }
    }
}


void citire ()
{
    FILE *in = fopen ("flip.in", "rt");
    fscanf (in, "%d %d", &N, &M);
    for(int i=1;i<=N;i++)
        for(int j=1;j<=M;j++)
            fscanf (in, "%d ", &A[i][j]);
    fclose(in);
}

void afisare ()
{
    FILE *out = fopen ("flip.out", "wt");
    fprintf(out, "%ld", S);
    fclose(out);
}

int main ()
{
    citire ();
    back(1);
    afisare();
    return 0;
}