Cod sursa(job #1760980)

Utilizator leraValeria lera Data 21 septembrie 2016 17:30:29
Problema Jocul Flip Scor 0
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.78 kb
#include <iostream>
#include <fstream>
using namespace std;
ifstream fin("flip.in");
ofstream fout("flip.out");
long long c[18],l[18],nrl=0,nrc=0,a[18][18],col[18],lin[18],maxx,s;
int solutie(int linii,int coloane)
{
    int i,sum=0,ss;
    ss=s;
    for(i=1;i<=linii;i++)
            {
                ss-=a[lin[l[i]]][0];
                sum+=(a[lin[l[i]]][0]*(-1));
            }
    for(i=1;i<=coloane;i++)
        {
            ss-=a[0][col[c[i]]];
            sum+=a[0][col[c[i]]]*(-1);
            for(int j=1;j<=linii;j++)sum+=a[lin[l[j]]][col[c[i]]];
        }
    return sum+ss;
}
void bkl(int k,int kk)
{
    int numar;
    if(k==1 || k==0)
        numar=0;
    else numar=l[k-1];
    for(int i=numar+1;i<=nrl;i++)
    {
        l[k]=i;//linii
        if(k<=nrl)
            {
                if(solutie(k,kk)>maxx)maxx=solutie(k,kk);
                if(k==nrl)return;
                else
                bkl(k+1,kk);
            }
    }
}
void bkc(int k)
{
    int numar;
     if(k==0 || k==1)
        numar=0;
    else numar=c[k-1];
    for(int i=numar+1;i<=nrc;i++)
    {
        c[k]=i;//coloane
        if(k<=nrc)
        {
            bkl(0,k);
            if(k==nrc)
                return;
            else
            bkc(k+1);

        }

    }

}
int main()
{
    int n,m,i,j;
    fin>>n>>m;
    for(i=1;i<=n;i++)
        for(j=1;j<=m;j++)
            {
                fin>>a[i][j];
                s+=a[i][j];
                a[i][0]+=a[i][j];
                a[0][j]+=a[i][j];
            }
    maxx=s;
    for(i=1;i<=m;i++)
    if(a[0][i]<0){
        nrc++;
        col[nrc]=i;
    }
    for(i=1;i<=n;i++)if(a[i][0]<0)
    {
        nrl++;
        lin[nrl]=i;
    }
    bkc(0);
    fout<<maxx;
    return 0;
}