Cod sursa(job #1066455)

Utilizator DenisacheDenis Ehorovici Denisache Data 24 decembrie 2013 21:00:37
Problema Jocul Flip Scor 20
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.56 kb
#include <stdio.h>
using namespace std;
FILE*f=fopen("flip.in","r");
FILE*g=fopen("flip.out","w");
int a[30][30],nrsub1,nrsub2,n,m,smax,s,i,j,k,l,b[30][30],lung1,lung2,v1[66000],v2[66000];
void tc(int x)
{
    for (short int i=1;i<=n;i++)
    {
        a[i][x]*=-1;
    }
}
void tl(int x)
{
    for (short int i=1;i<=m;i++)
    {
        a[x][i]*=-1;
    }
}
void sum()
{
    for (short int i=1;i<=n;i++)
    {
        for (short int j=1;j<=n;j++)
        {
            s+=a[i][j];
        }
    }
}
int main()
{
    fscanf(f,"%d%d",&n,&m);
    for (i=1;i<=n;i++)
    {
        for (j=1;j<=m;j++)
        {
            fscanf(f,"%d",&a[i][j]);
            b[i][j]=a[i][j];
        }
    }
    nrsub1=1<<m;
    nrsub2=1<<n;
    for (i=1;i<nrsub1;i++)
    {
        lung1=0;
        for (j=1;j<=m;j++)
        {
            if (i&(1<<(j-1)))
            {
                tc(j);
                lung1++;
                v1[lung1]=j;
            }
        }
        for (k=1;k<nrsub2;k++)
        {
            s=0; lung2=0;
            for (l=1;l<=n;l++)
            {
                if (k&(1<<(l-1)))
                {
                    tl(l);
                    lung2++;
                    v2[lung2]=l;
                }
            }
            sum();
            for (j=1;j<=lung2;j++)
            {
                tl(v2[j]);
            }
            if (s>smax) smax=s;
        }
        for (j=1;j<=lung1;j++)
        {
            tc(v1[j]);
        }
    }
    fprintf(g,"%d",smax);
    return 0;
}