Cod sursa(job #695701)

Utilizator impulseBagu Alexandru impulse Data 28 februarie 2012 13:59:53
Problema Jocul Flip Scor 30
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.46 kb
#include <stdio.h>
#include <iostream>
#define ifile "flip.in", "r"
#define ofile "flip.out", "w"
using namespace std;
FILE * f=fopen(ifile);
FILE * g=fopen(ofile);
#define TMax 17
//    N     M            N linii
int T[TMax][TMax], N, M, L[TMax], COM, SMax = 0;

int step1()
{
    fscanf(f, "%d %d", &N, &M);
    for(int i = 0; i < N; i++)
        for(int j = 0; j < M; j++)
            fscanf(f, "%d", &T[i][j]),
                L[i] += T[i][j];
    return 0;
}

int sumUp()
{
    int cSum = 0;
    for(int i = 0; i < N; i++) cSum += L[i];
    if(cSum > SMax) SMax = cSum;
    return cSum;
}

int cSwitch(int c)
{
    for(int i = 0; i < N; i++)
    {
        int prev = T[i][c];
        T[i][c] *= -1;
        L[i] = L[i] - prev + T[i][c];
    }
    return 0;
}

int lSwitch(int l)
{
    int lSum = 0;
    for(int i = 0; i < M; i++)
    {
        T[l][i] *= -1;
        lSum += T[l][i];
    }
    L[l] = lSum;
    return 0;
}

int handleCOM()
{
    for(int i = 0; i < N; i++)
        if((COM & (1 << i))) lSwitch(i);
    for(int i = 0; i < M; i++)
        if((COM & (1 << (N + i)))) cSwitch(i);
    return 0;
}
int step2()
{
    int K = N + M + 1;
    while((COM & (1 << K)) == 0)
    {
        COM++;
        handleCOM();
        sumUp();
        handleCOM();
    }
    return 0;
}
int step3()
{
    fprintf(g, "%d", SMax);
    return 0;
}
int main()
{
    step1();
    step2();
    step3();
    return 0;
}