Cod sursa(job #602653)

Utilizator andrianAndrian andrian Data 12 iulie 2011 13:24:51
Problema Jocul Flip Scor 0
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.23 kb
#include <iostream>
#include <fstream>
#define nmax 17
#define size (sizeof(long)*8)
using namespace std;

int n, m, suma=0;
long a[nmax][nmax], b[nmax][nmax];

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

void citire(){
    ifstream in("flip.in");
    in >> n >> m;
    for(int i=0;i<n;++i)
        for(int j=0;j<m;++j)
            in >> b[i][j];
    in.close();
}

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

void comuta_linie(int x){
    for(int i=0;i<m;++i)
        a[x][i] *= -1;
}

void comuta_coloana(int x){
    for(int i=0;i<n;++i)
        a[i][x] *= -1;
}

void afis(){
    ofstream out("flip.out");
    out << suma;
    out.close();
}

bool bit(long x, int i){
    return (x>>i)&1;
}

void analiz(long x, long y){
    int s;
    reset();
    for(int i=0;i<n;++i)
        if(bit(x,i)) comuta_linie(i);
    for(int i=0;i<m;++i)
        if(bit(y,i)) comuta_coloana(i);
    s = sm();
    if(s>suma) suma = s;
}

void rezolv(){
    long i,j;
    suma = sm();
    for(i=0;i<n;++i)
        for(j=0;j<m;++j)
            analiz(i,j);
}

int main()
{
    citire();
    reset();
    rezolv();
    afis();
    return 0;
}