Cod sursa(job #651757)

Utilizator repp4raduRadu-Andrei Szasz repp4radu Data 21 decembrie 2011 15:13:54
Problema Jocul Flip Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.91 kb
#include <fstream>

#define InFile "flip.in"
#define OutFile "flip.out"

using namespace std;

ifstream in(InFile);
ofstream out(OutFile);

int matrice[17][17];

int reverseM[17];

int maxim;

void increase(int m)
{
    reverseM[m]++;
    while(reverseM[m] % 2 == 0)
    {
        reverseM[m] = 0;
        m--;
        reverseM[m]++;
    }
}

void citire(int &n, int &m)
{
    in>>n>>m;
    for(int i = 1; i <= n; i++)
    {
        for(int j = 1; j <= m; j++)
        {
            in>>matrice[i][j];
        }
    }
}

int getSuma(int &n, int &m)
{
    int s = 0;
    int sLinie;
    for(int i = 1; i <= n; i++)
    {
        sLinie = 0;
        for(int j = 1; j <= m; j++)
        {
            s += matrice[i][j];
            sLinie += matrice[i][j];
        }
        matrice[i][0] = sLinie;
    }
    return s;
}

int inverse(int &n,int &m)
{
    int asFarAs = 1;
    int s = 0;
    for(int i = 1; i <= m; i++)
    {
        asFarAs*=2;
    }
    for(int i = 1; i <= asFarAs; i++)
    {
        increase(m);

        for(int j = 1; j <= m; j++)
        {
            if(reverseM[j])
            {
                for(int h = 1; h <= n; h++)
                {
                    matrice[h][j] *= -1;
                }
            }
        }
        s = getSuma(n, m);
        for(int j = 1; j <= n; j++)
        {
            if(matrice[j][0] < 0)
            {
                s -= (2*matrice[j][0]);
            }
        }
        if(s > maxim)
        {
            maxim = s;
        }
        for(int j = 1; j <= m; j++)
        {
            if(reverseM[j])
            {
                for(int h = 1; h <= n; h++)
                {
                    matrice[h][j] *= -1;
                }
            }
        }
    }
    return maxim;
}



int main()
{
    int n, m;
    citire(n, m);
    out<<inverse(n, m);
    return 0;
}