Cod sursa(job #602786)

Utilizator andrianAndrian andrian Data 13 iulie 2011 01:05:33
Problema Cifra Scor 0
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.33 kb
#include <iostream>
#include <fstream>
#define nmax 17
#define size (sizeof(long)*8)
using namespace std;

int n, m, suma=-100000;
long a[nmax][nmax], b[nmax][nmax];
long st[2*nmax], k;

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 valid(int k)
{
    if(k>1) return st[k] > st[k-1];
    return true;
}

void work(int k)
{
    reset();
    for(int i=1;i<=k;++i)
        if(st[i] <= 16) comuta_coloana(st[i]);
        else comuta_linie(st[i]-16);
    int s = sm();
    if(s>suma)suma = s;

}

void bk(int k){
    for(int p=1;p<=32;++p)
    {
        st[k+1] = p;
        if(valid(k+1))
        {
            work(k+1);
            bk(k+1);
        }
    }
}

void rezolv(){
    suma = sm();
    bk(0);
}

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