Cod sursa(job #193461)

Utilizator carloneIoan-Carol Plangu carlone Data 4 iunie 2008 17:15:35
Problema Jocul Flip Scor 30
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.17 kb
#include"stdio.h"
#define vrt 1
#define orz 2
void afis();
long mx[16][16],SUM_MAX=-2000000000,SUM;int n,m,g,h,st[33];
long sum()
{
     long sum=0;
     for(int g=1;g<=m;g++)for(int h=1;h<=n;h++)sum+=mx[h][g];
     return sum;
}
void flip(int x,int y)
{
switch(y)
{
case vrt:for(int g=1;g<=n;g++)mx[g][x]=-mx[g][x];return;
case orz:for(int g=1;g<=m;g++)mx[x][g]=-mx[x][g];return;
}  
}
void fflip()
{

     for(int g=1;g<=n+m;g++)
     {
     if(st[g])
     {
     if(g<=n)flip(g,orz);
     else flip(g-n,vrt);}
     }
}
void back(int k)
{
     if(k==n+m+1)//{for(int g=1;g<k;g++)printf("%d",st[g]);printf("\n");}
     {fflip();SUM=sum();if(SUM>SUM_MAX)SUM_MAX=SUM;fflip();}
     else
     //
     ///
     {st[k]=0;back(k+1);st[k]=1;back(k+1);}
     ///
}
void afis()
{
for(int g=1;g<=n;g++){for(int h=1;h<=m;h++)printf("%d ",mx[g][h]);printf("\n");}
}
int main()
{
     freopen("flip.in","r",stdin);freopen("flip.out","w",stdout);
     scanf("%d%d",&n,&m);
     for(g=1;g<=n;g++)for(h=1;h<=m;h++){scanf("%d",&mx[g][h]);}
     //back(1);
     st[3]=1;
     //fflip();
     //afis();
     back(1);
     printf("%ld\n",SUM_MAX);
     return 0;
}