Cod sursa(job #12759)

Utilizator DastasIonescu Vlad Dastas Data 4 februarie 2007 18:23:27
Problema Jocul Flip Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.57 kb
#include <stdio.h>

FILE *in = fopen("flip.in", "r"), *out = fopen("flip.out", "w");

int a[17][17];
int N, M;
int S = 0;

void read()
{
    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]);

}

void print()
{
    for ( int i = 1; i <= N; ++i )
    {
        for ( int j = 1; j <= M; ++j )
            printf("%d ", a[i][j]);
        printf("\n");
    }
}

void flip_l(int linie)
{
    for ( int i = 1; i <= M; ++i )
        a[linie][i] *= -1;
}

void flip_c(int coloana)
{
    for ( int i = 1; i <= N; ++i )
        a[i][coloana] *= -1;
}

int suma(int coloana)
{
    int s = 0;
    for ( int i = 1; i <= N; ++i )
        s += a[i][coloana];

    return s;
}

void verif_col()
{
    for ( int i = 1; i <= M; ++i )
        if ( suma(i) < 0 )
            flip_c(i);
}

void sumfin()
{
    int t = 0;
    for ( int i = 1; i <= N; ++i )
        for ( int j = 1; j <= M; ++j )
            t += a[i][j];

    if ( t > S )
        S = t;
}


void back(int linie)
{
    for ( int i = 0; i <= 1; ++i )
    {
        if ( i == 0 )
        {
            verif_col();
            sumfin();
            if ( linie != N )
                back(linie+1);
        }
        else
        {
            flip_l(linie);
            verif_col();
            sumfin();
            if ( linie != N )
                back(linie+1);
        }
    }
}

int main()
{
    read();
    back(1);
    fprintf(out, "%d\n", S);



    return 0;
}