Cod sursa(job #772430)

Utilizator vlase.paulVlase Paul vlase.paul Data 29 iulie 2012 18:33:51
Problema Jocul Flip Scor 0
Compilator c Status done
Runda Arhiva de probleme Marime 1.69 kb
#include <stdio.h>
#include <stdlib.h>

typedef struct flip {
    int m, n;
    int board[16][16];
    int sw[16];
    int max_sum;
} flip_t;

void read_input( flip_t *flip )
{
    int i, j;

    scanf( "%d %d", &flip->m, &flip->n );

    for ( i = 0; i < flip->m; i++ ) {
        for ( j = 0; j < flip->n; j++ ) {
            scanf( "%d", &flip->board[i][j] );
        }
    }
}

void write_output( flip_t *flip )
{
    printf( "%d\n", flip->max_sum );
}

void compute_sum( flip_t *flip )
{
    int i, j;
    int sum = 0, s;

    for ( i = 0; i < flip->m; i++ ) {
        s = 0;
        for ( j = 0; j < flip->n; j++ ) {
            if ( flip->sw[i] ) {
                s -= flip->board[i][j];
            } else {
                s += flip->board[i][j];
            }
        }

        if ( s < 0 ) {
            sum -= s;
        } else {
            sum += s;
        }
    }

    if ( sum > flip->max_sum ) {
        flip->max_sum = sum;
    }
}

void backtracking( flip_t *flip )
{
    int i;
    int j;

    do {
        for ( j = 0; j < flip->m; ++j ) {
            printf( "%d", flip->sw[j] );
        }
        printf( "\n" );

        compute_sum( flip );

        i = flip->m - 1;
        while( flip->sw[i] == 1 && i >= 0 ) {
            flip->sw[i--] = 0;
        }

        if ( i < 0 ) {
            return;
        }
        flip->sw[i] = 1;
         for ( j = 0; j < flip->m; ++j ) {
            printf( "%d", flip->sw[j] );
        }
        printf( "\n" );

   } while( 1 );
}

int main( void )
{
    flip_t flip = {};

    freopen( "flip.in", "r", stdin );
    freopen( "flip.out", "w", stdout );

    read_input( &flip );
    backtracking( &flip );
    write_output( &flip );

    return EXIT_SUCCESS;
}