Cod sursa(job #1241822)

Utilizator stefanlaculeanuLaculeanu Stefan stefanlaculeanu Data 13 octombrie 2014 20:13:05
Problema Jocul Flip Scor 0
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.84 kb
#include <iostream>
#include <fstream>
using namespace std;
ifstream in("flip.in");
ofstream out("flip.out");
int s[20],z[20][20],n,k,p,m,sum ,suma[40],q=1,o=1,maxim,t[40];
void
init()
{
    s[k]=-1;
}
int succesor()
{
    if(s[k]<1)
    {
        s[k]++;
        return 1;
    }
    else return 0;
}
int
valid()
{
    return 1;
}
int
solutie()
{
    return
    (k==n+m);
}
void
tipar()
{
    int tt=1;
    for(int i=1; i<=n; i++)
    {
        if(s[i]==1)
        {
            t[i]=0;
            tt=0;
            sum=sum-suma[i];
            sum=sum+(suma[i]*(-1));
        }
    }
    int j=n+1;
    while( j<=n+m)
    {
        if((s[j]==1)&&(tt!=0))
        {
            sum=sum-suma[j];
            sum=sum+(suma[j]*(-1));
            for(int e=0;e<=n;e++)
            {
                if(t[e]==0)
                {
                    sum=sum+(z[e][j-n]*(-1));
                }
            }
        }
        j++;
    }
    if(maxim<sum)
        maxim=sum;
}
void back()
{
    int as;
    k=1;
    init();
    while(k>0)
    {
        do
        {
            as=succesor();
        }
        while(as&&!valid());
        if(as)
            if(solutie()) tipar();
            else
                {
                    k++;
                    init();
                }
                else k--;
    }
}


int main()
{
    int k;
    in>>n>>m;
    int i , j;
    for(i=1; i<=n; i++)
    {
        for(j=1;j<=m;j++)
        {
            in>>z[i][j];
            sum=sum+z[i][j];
        }
    }
    while(q<=n){
    for(j=1;j<=m;j++)
    {
        suma[q]=suma[q]+z[q][j];
    }
    q++;
    }
    while(q<=n+m){
    for(j=1;j<=n;j++)
    {
        suma[q]=suma[q]+z[j][o];
    }
    q++;
    o++;
    }
    back();
    cout<<maxim;
    return 0;
}