Cod sursa(job #2277374)

Utilizator Anastasia_StefanescuAnastasia Stefanescu Anastasia_Stefanescu Data 6 noiembrie 2018 08:47:38
Problema Elimin Scor 0
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 1.83 kb
#include <fstream>
#include <iostream>
#include <math.h>
#include <bitset>
using namespace std;

ifstream fin ("flip.in");
ofstream fout ("flip.out");

int n, m, x[17][17], aux[17][17], aux2[17][17], a;

void reinitializare()
{
    int i, j;
    for (i = 1; i<= n; i++)
        for(j = 1; j<= m; j++)
            aux[i][j] = x[i][j];
}

void memorare()
{
    int i, j;
    for (i = 1; i<= n; i++)
        for(j = 1; j<= m; j++)
            aux2[i][j] = aux[i][j];
}

void restaurare()
{
    int i, j;
    for (i = 1; i<= n; i++)
        for(j = 1; j<= m; j++)
            aux[i][j] = aux2[i][j];
}

void flip_lin(int linie)
{
    int i;
    for (i = 1; i<= m; i++)
        aux[linie][i] *= -1;
}

void flip_col(int coloana)
{
    int i;
    for (i = 1; i<= n; i++)
        aux[i][coloana] *= -1;
}

int suma()
{
    int i, j, s = 0;
    for (i = 1; i<= n; i++)
        for(j = 1; j<= m; j++)
             s+=aux[i][j];
    return s;
}
int main()
{
 
    int i, j, submult_lin, submult_col, l, k, s_max=0, s;
    fin >> n >> m;
    for (i = 1; i<= n; i++)
        for(j = 1; j<= m; j++)
            fin >> x[i][j];
    
    submult_lin = (1 << n)-1;
    submult_col = (1<<m) -1;
    for (i = 1; i<= submult_lin; i++)
    {
        reinitializare();
        // flipuri pe linii pentru submultimea i
        for(j = 0; j<submult_lin; j++)
            if (((i >> j) & 1) != 0)
            {
                flip_lin(j+1);
            }
        for (l = 1; l<= submult_col; l++)
        {
            memorare();
            // flipuri pe coloane pentru submultimea j
            for(k = 0; k<submult_lin; k++)
                if (((l >> k) & 1) != 0)
                {
                    flip_col(k+1);
                }
            s = suma();
            if (s > s_max)
                s_max = s;
            restaurare();
        }
    }
    
    fout << s_max;
    return 0;
}