Cod sursa(job #102150)

Utilizator the_alch3m1stJeler Stefan the_alch3m1st Data 14 noiembrie 2007 00:26:33
Problema Jocul Flip Scor 60
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.94 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];
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()
 {
      register int i,j;
      for(i=1;i<=N;i++) 
                  for(j=1;j<=M;j++) b[i][j]=a[i][j];
}

void greedy()
{register int i,j,s;
     for(i=1;i<=N;i++)
     {s=0;
                      for(j=1;j<=M;j++)s+=b[i][j];
      if(s<0)
      {
       for(j=1;j<=M;j++) b[i][j]*=-1;
       }
      }
}
       

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

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()
{

    flip();
}

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;
 int i,j,s=0,k=0;
 for(i=1;i<=N;i++)
 for(j=1;j<=M;j++){if(a[i][j]<0) k=1; s+=a[i][j];}
 if(k)
 bt();
 else suma=s;
 scrie();

}