Cod sursa(job #2371798)

Utilizator etienAndrone Stefan etien Data 6 martie 2019 19:40:59
Problema Jocul Flip Scor 20
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 1.44 kb
#include<fstream>
#include<iostream>
using namespace std;
ifstream fin("flip.in");
ofstream fout("flip.out");
int n,m,i,j,mat[17][17],s,ss;
struct alegere
{
    int nr;
    char d;
};
alegere v[35];
bool ales[35];
int im[35];
int suma(int k)
{
    int sss=0;
    int ii;
    if(v[k].d=='L')
        for(ii=1;ii<=m;ii++)
            sss+=mat[v[k].nr][ii];
    else
        for(ii=1;ii<=n;ii++)
            sss+=mat[ii][v[k].nr];
    return sss;
}
void comuta(int k)
{
    int ii;
    ales[k]=true;
    ss-=2*suma(k);
    if(v[k].d=='L')
        for(ii=1;ii<=m;ii++)
            mat[v[k].nr][ii]*=-1;
    else
        for(ii=1;ii<=n;ii++)
            mat[ii][v[k].nr]*=-1;
    if(s<ss)
        s=ss;
}
void decomuta(int k)
{
    comuta(k);
    ales[k]=false;
}
bool valid(int k)
{
    if(suma(k)<0&&!ales[k])
        return true;
    return false;
}
void back_on_track(int p)
{
    comuta(p);
    cout<<p<<" ";
    for(im[p]=1;im[p]<=n+m;im[p]++)
        if(valid(im[p]))
            back_on_track(im[p]);
    decomuta(p);
}
int main()
{
    fin>>n>>m;
    for(i=1;i<=n;i++)
        for(j=1;j<=m;j++)
        {fin>>mat[i][j];
        ss+=mat[i][j];}
    for(i=1;i<=n;i++)
    {
        v[i].nr=i;
        v[i].d='L';
    }
    for(i=n+1;i<=n+m;i++)
    {
        v[i].nr=i-n;
        v[i].d='C';
    }
    for(i=1;i<=n+m;i++)
        if(valid(i))
            back_on_track(i);
    fout<<s;
}