Cod sursa(job #1732601)

Utilizator bmihaiBaba Sebastian Mihai bmihai Data 22 iulie 2016 00:03:50
Problema Jocul Flip Scor 100
Compilator c Status done
Runda Arhiva de probleme Marime 1.79 kb
#include <stdio.h>

int N, M;
int grid[16][16];
int temp_grid[16][16];

void read_data(FILE *f)
{
    fscanf(f, "%d %d", &N, &M);
    
    int i, j;
    for (i = 0; i < N; ++i)
        for (j = 0; j < M; ++j)
            fscanf(f, "%d", &grid[i][j]);
}

void flip_line(int line)
{
    int i;
    
    for (i = 0; i < M; ++i)
        temp_grid[line][i] *= -1;
}

void flip_col(int col)
{
    int i;
    
    for (i = 0; i < N; ++i)
        temp_grid[i][col] *= -1;
}

int line_sum(int line)
{
    int i;
    int s = 0;
    
    for (i = 0; i < M; ++i)
        s += temp_grid[line][i];
    
    return s;
}

int col_sum(int col)
{
    int i;
    int s = 0;
    
    for (i = 0; i < N; ++i)
        s += temp_grid[i][col];
    
    return s;
}

int calc_max_sum()
{
    int counter = 0;
    int max_iter = 1 << N;
    int max_sum = 0;
    
    while (counter < max_iter)
    {
        int i, j;
        int cur_sum = 0;
        
        for (i = 0; i < N; ++i)
            for (j = 0; j < M; ++j)
                temp_grid[i][j] = grid[i][j];
        
        for (i = 0; i < N; ++i)
            if ((counter >> i) & 1)
                flip_line(i);
            
        for (i = 0; i < M; ++i)
            if (col_sum(i) < 0)
                flip_col(i);
            
        for (i = 0; i < N; ++i)
            for (j = 0; j < M; ++j)
                cur_sum += temp_grid[i][j];
            
        if (cur_sum > max_sum)
            max_sum = cur_sum;
        
        ++counter;
    }
    
    return max_sum;
}

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

    read_data(in);
    
    fprintf(out, "%d", calc_max_sum());
    
    fclose(in);
    fclose(out);
    
    return 0;
}