Cod sursa(job #1722790)

Utilizator andrei4_bulzanAndrei Bulzan andrei4_bulzan Data 28 iunie 2016 20:42:20
Problema Jocul Flip Scor 100
Compilator c Status done
Runda Arhiva de probleme Marime 1.77 kb
#include <stdio.h>
#include <stdlib.h>
#include <math.h>

int suma(int a[][16], int n, int m)
{
    int i, j, s=0;
    for(i=0; i<n; i++)
        for(j=0; j<m; j++)
        s=s+a[i][j];
    return s;
}

void copy(int a[][16], int b[][16], int n, int m)
{
    int i, j;
    for(i=0; i<n; i++)
        for(j=0; j<m; j++)
            a[i][j] = b[i][j];
}

void flip_linie(int a[][16], int i, int m)
{
    int j;
    for(j=0; j<m; j++)
        a[i][j] = -a[i][j];
}

void flip_coloana(int a[][16], int j, int n)
{
    int i;
    for(i=0; i<n; i++)
        a[i][j] = -a[i][j];
}

int s_flip_coloana(int a[][16], int j, int n)
{
    int i, s=0;
    for(i=0; i<n; i++)
        s = s - a[i][j];
    return s;
}

int s_coloana(int a[][16], int j, int n)
{
    int i, s=0;
    for(i=0; i<n; i++)
        s = s + a[i][j];
    return s;
}

void flip_col(int a[][16], int n, int m)
{
    int i, j;
    for(j=0; j<m; j++)
        if(s_coloana(a, j, n) < s_flip_coloana(a, j, n))
            flip_coloana(a, j, n);
}

int main()
{
    FILE *f = fopen("flip.in", "r");
    FILE *g = fopen("flip.out", "w");
    int n, m, i, j, k, smax=0, nmax, t[16][16], aux[16][16], s;
    fscanf(f, "%d%d", &n, &m);
    printf("%d %d", n, m);
    for(i=0; i<n; i++)
        for(j=0; j<m; j++)
        {
            fscanf(f, "%d", &t[i][j]);
            smax = smax + t[i][j];
        }
    nmax = pow(2, n);
    for(k=1; k<nmax; k++)
    {
        copy(aux, t, n, m);
        for(i=0; i<n; i++)
            if( (1<<i) & k )
                flip_linie(aux, i, m);
        flip_col(aux, n, m);
        s = suma(aux, n, m);
        if(s > smax)
                smax = s;
    }
    fprintf(g, "%d", smax);
    fclose(f);
    fclose(g);
    return 0;
}