Cod sursa(job #101984)

Utilizator the_alch3m1stJeler Stefan the_alch3m1st Data 13 noiembrie 2007 22:51:10
Problema Jocul Flip Scor 0
Compilator cpp Status done
Runda Arhiva de probleme Marime 2.01 kb
#include<iostream.h>
#include<fstream.h>

typedef int stiva[100];
int n,k,ev,as,suma=0,a[16][16],N,M,b[16][16],c[16][16];
stiva st;

void citire()
{int i,j;
     fstream fin("flip.in",ios::in);
     fin>>N;
     fin>>M;
     for(i=1;i<=N;i++)
     for(j=1;j<=M;j++) fin>>a[i][j];
     fin.close();
     
 }

void reset()
{
     int i,j;
     for (i=1;i<=N;i++)
     for(j=1;j<=M;j++)b[i][j]=a[i][j];
}

void reset_c()
{
     int i,j;
     for (i=1;i<=N;i++)
     for(j=1;j<=M;j++)c[i][j]=b[i][j];
}

void copiere()
{
     int i,j;
     for(i=1;i<=N;i++)
     for(i=1;i<=M;j++)b[i][j]=c[i][j];
}

int suma_c()
{
        int i,j,suma=0;
        for(i=1;i<=N;i++)
        for(j=1;j<=M;j++) suma+=c[i][j];
return suma;
}




void init()
{
     st[k]=-1;
}

int succesor()
{
    if(st[k]<1)
    {st[k]=st[k]+1; return 1;}
     else return 0;
     
}

int valid()
{
    return 1;
}

int solutie()
{
    return k==n;
}

void tipar()
{
reset();
int i,j,s=0,s2;
for(i=1;i<=N;i++)
for(j=1;j<=M;j++){
                  if(st[j]==1)b[i][j]*=-1;
                  s+=b[i][j];
                  }
if(s>suma)suma=s;
s=0;

reset_c();
for(i=1;i<=M;i++)
{
                  s=suma_c();
                 for(j=1;j<=N;j++)c[j][i]*=-1;
                            
                  s2=suma_c();
                  
                   if(s2>s) {copiere();suma=s2;}
                              else reset_c();
  
}//for
 
}

void bt()
{
     k=1;
     init();
     while(k>0)
     {
               as=1;ev=0;
               while(as && !ev)
               {
                        as=succesor();
                        if(as) ev=valid();
               }
     if(as)
           if(solutie())tipar();
                                else {k++;init();}
           else k--;
           
     }
}


void scrie()
{
     fstream fout("flip.out",ios::out);
     fout<<suma;
     fout.close();
}
int main()
{
 citire();
 n=M;
 bt();
 scrie();

}