Cod sursa(job #152953)

Utilizator Snavenportnespecificat Snavenport Data 9 martie 2008 22:24:47
Problema Perle Scor 10
Compilator cpp Status done
Runda Arhiva de probleme Marime 3.2 kb
#include <fstream.h>

ifstream f("perle.in");
ofstream g("perle.out");

int sir[10003],sir2[10003],n;

void init()
{
     int i;
     for (i=1;i<=10002;i++)
     {
         sir[i]=0;
         sir2[i]=0;
     }
}

int sw,l,imax;

void transf_b(int a)
{
     int i,j;
     if (a==l)
        sw=1;   // nu se poate realiza transformarea pt ca perla B se transforma in 2 perle 
     else
      if (sir[a]==2)  // perla B se poate trasforma in 2B
       {
         for (j=imax;j>a;j--)
           sir2[j+2]=sir2[j];
         sir2[a]=2;
         sir2[a+1]=5;
         imax=imax+1;
       }
      else
        if (sir[a]==1)  // perla B se poate transforma in 1A3AC
         {
            for (j=imax;j>a;j--)
               sir2[j+5]=sir2[j];
            sir2[a]=1;
            sir2[a+1]=4;
            sir2[a+2]=3;
            sir2[a+3]=4;
            sir2[a+4]=6;
            imax=imax+4;
         }  
        else
          sw=1;
      if (imax>l) // daca s-a depasit lungimea sirului nu exista solutie
         sw=1;
}

void transf_c(int a)
{
     int j;
      if (sir[a]==2)
         sir2[a]=2;
      else
        if (sir[a]==3)
        {
           for (j=imax;j>a;j--)
              sir2[j+3]=sir2[j];
           sir2[a]=3;
           sir2[a+1]=5;
           sir2[a+2]=6;
           imax=imax+2;
        }
        else
          if (sir[a]==1)
            {
           for (j=imax;j>a;j--)
              sir2[j+3]=sir2[j];
           sir2[a]=1;
           sir2[a+1]=2;
           sir2[a+2]=4;
           imax=imax+2;
             } 
           else
             sw=1;     
      if (imax>l)
         sw=1;
}

int rez()
{
    if (l==1 && sir[1]<=3)
       return 1;
    else
      if (n>=2 && sir[1]==2)
         {                              // A=4, B=5, C=6;
               sir2[1]=2;
               sir2[2]=5;                
               imax=2;  
         }
      else
        if (n>3 && sir[1]==1)
          {
                sir2[1]=1;
                sir2[2]=4;
                sir2[3]=3;
                sir2[4]=4;
                sir2[5]=6;
                imax=5;
          }
        else
          if (sir[1]==3)
             {
             sir2[1]=6;
             imax=1;
             }
          else
            if (sir[1]==1 && sir[2]==2 && n==3)
               {
                   sir2[1]=1;
                   sir2[2]=2;
                   sir2[3]=4;
                   imax=3;
               }
      if (sir2[1]==0)
         return 0;             // nu exista perla magica de inceput
      int i,j;
      i=1;
      sw=0;
     while (i<=l && sw==0)
      {
            if (sir2[i]==5)
              transf_b(i);
            else
            if (sir2[i]==6)
              transf_c(i);
            i++;
      }  
    if (sw==1)
       return 0;
    else
       return 1;
   
}      
      
         

main()
{
      f>>n;
      int k,a;
      for (k=1;k<=n;k++)
      {
          init();
          f>>l;
          for (a=1;a<=l;a++)
             f>>sir[a];
          g<<rez()<<"\n";
          /*for (a=1;a<=l;a++)
             g<<sir[a]<<"   "<<sir2[a]<<"\n";
          g<<"\n";*/
          
      }
}