Cod sursa(job #1159926)

Utilizator alevasluialeHuhurez Marius alevasluiale Data 29 martie 2014 23:08:05
Problema Jocul Flip Scor 10
Compilator cpp Status done
Runda Arhiva de probleme Marime 2.84 kb
#include <cstdio>

using namespace std;
int n,m,i,j,ok,k,v[16][16],minim=1000000,poz,pozitie,c[16][2],l[16][2],suma;
void functie()
{
    if(ok==1)
    {

        for(i=0;i<m;i++)
        {
                l[poz][0]-=v[poz][i];
                l[poz][1]-=v[poz][i];
                c[i][0]-=v[poz][i];
                c[i][1]-=v[poz][i];
                v[poz][i]=-v[poz][i];
            if(c[i][0]+c[i][1]<minim)
            {
                minim=c[i][0];
                pozitie=i;
                ok=0;
            }
        }

    }
    else
    {
        for(i=0;i<n;i++)
        {
                l[i][0]-=v[i][poz];
                l[i][1]-=v[i][poz];
                c[poz][0]-=v[i][poz];
                c[poz][1]-=v[i][poz];
                v[i][poz]=-v[i][poz];
                if(l[i][0]+l[i][1]<minim)
                {
                    minim=l[i][0];
                    pozitie=i;
                    ok=1;
                }
        }
        for(j=0;j<m;j++)
        {
            if(c[j][0]+c[j][1]<minim)
            {
            minim=c[j][0];
            pozitie=j;
            ok=0;
            }
        }
    }
        if(ok==0)
    {
        if(suma-minim*2-c[pozitie][1]*2>suma)
        {
            suma=suma-minim*2-c[pozitie][1]*2;
            minim=1000000;
            poz=pozitie;
            functie();
        }
        else printf("%d",suma);
    }
    else
    {
        if(suma-minim*2-l[pozitie][1]*2>suma)
        {
            suma=suma-minim*2-l[pozitie][1]*2;
            poz=pozitie;
            functie();
        }
        else printf("%d",suma);
    }





}

int main()
{
    freopen("flip.in","r",stdin);
    freopen("flip.out","w",stdout);
    scanf("%d%d",&n,&m);
    for(i=0;i<n;i++)
    {
        for(j=0;j<m;j++)
        {
            scanf("%d",&k);
            suma+=k;
            v[i][j]=k;
            if(k<0)
            {
                l[i][0]+=k;
                c[j][0]+=k;
            }
            else
            {
                l[i][1]+=k;
                c[j][1]+=k;
            }
        }
        if(l[i][0]+l[i][1]<minim)
        {
            minim=l[i][0];
            poz=i;
            ok=1;
        }
    }
    for(j=0;j<m;j++)
    {
        if(c[j][0]+c[j][1]<minim)
        {
            minim=c[j][0];
            poz=j;
            ok=0;
        }
    }
    if(ok==0)
    {
        if(suma-minim*2-c[poz][1]*2>suma)
        {
            suma=suma-minim*2-c[poz][1]*2;
            minim=1000000;
            functie();
        }
        else printf("%d",suma);
    }
    else
    {
        if(suma-minim*2-l[poz][1]*2>suma)
        {
            suma=suma-minim*2-c[poz][1]*2;
            minim=1000000;
            functie();
        }
        else printf("%d",suma);
    }
}