Cod sursa(job #1491925)

Utilizator Y0da1NUME JMECHER Y0da1 Data 26 septembrie 2015 15:39:17
Problema Jocul Flip Scor 40
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.83 kb
#include <iostream>
#include <fstream>
using namespace std;
int st[33], k, n, m, v[17][17], i, j, s, maxim=0, nr, v1[17][17];

int flip()
{
    //cout<<"5"<<endl;
    for(i=1;i<=n;i++)
    {
        if(v1[i][0]==1)
            for(j=1;j<=m;j++)
                v1[i][j]=-v1[i][j];
    }
    for(j=1;j<=m;j++)
    {
        if(v1[0][j]==1)
            for(i=1;i<=n;i++)
                v1[i][j]=-v1[i][j];
    }
    s=0;
    for(i=1;i<=n;i++)
        for(j=1;j<=m;j++)
         s=s+v1[i][j];
    //cout<<s<<endl;
    return s;
}
int succesor()
{
    if (st[k]<2)//pui aici cate nr
    {
        st[k]++;
        return 1;
    }
    else
        return 0;
}
int sol()
{
    //cout<<"3"<<endl;
    //cout<<k<<endl;
    //for(i=1;i<=nr;i++)
        //out<<st[i]-1;
    //out<<endl<<endl;
    return (k==nr);
}
void tipar()
{
    //cout<<"4"<<endl;
    for(i=1;i<=m;i++)
        v[0][i]=st[i]-1;
    for(i=m+1;i<=nr;i++)
        v[i-m][0]=st[i]-1;
    for(i=0;i<=n;i++)
        for(j=0;j<=m;j++)
        {
            v1[i][j]=v[i][j];
            //out<<v[i][j];
            //if(j==m)

                //out<<endl;
        }

    s=flip();
    //cout<<s<<endl;
    if(maxim<s)
        maxim=s;
}
void bk()
{
    //cout<<"1"<<endl;
    k=1;
    int as;
    while (k)
    {
        //cout<<"2"<<endl;
        as=succesor();
        if(as)
        {
            if(sol())
                tipar();
            else
            {
                k++;
                st[k]=0;
            }
        }
        else k--;
    }

}
int main()
{
    ifstream input ("flip.in");
    ofstream out ("flip.out");
    input>>n>>m;
    nr=n+m;
    //cout<<nr<<endl;
    for(i=1;i<=n;i++)
        for(j=1;j<=m;j++)
        {
            input>>v[i][j];
        }
    bk();
    out<<maxim;
}