Cod sursa(job #36222)

Utilizator alecmanAchim Ioan Alexandru alecman Data 23 martie 2007 10:54:27
Problema Perle Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 2.29 kb
/*
 *
 *
  info-arena 2.0 - Arhiva - Perle
 *
 *
 */

#include<stdio.h>
#include<string.h>
#include<stdlib.h>

#define INPUT "perle.in"
#define OUTPUT "perle.out"

FILE *fin=fopen(INPUT, "r"),*fout=fopen(OUTPUT, "w");

int n,a[10002],lungime;
char b[20000];

void citeste();
int rezolva();

int main()
{
  int t;
  fscanf(fin, "%d", &t);
  for(int i=1;i<=t;++i)
  {
    lungime=0;
    citeste();
    fprintf(fout, "%d\n", rezolva());
    memset(b,0,sizeof(b));
  }
  fclose(fin);
  fclose(fout);
  return 0;
}

void citeste()
{
  fscanf(fin, "%d", &n);
  for(int i=1;i<=n;++i)
   fscanf(fin, "%d", &a[i]);
  if(a[1]==1)
  {
    if(n==1)
    {
      b[1]='1';lungime=1;
    }
    else
    if(n==3)
    {
      b[1]='1';b[2]='2';b[3]='A';lungime=3;
    }
    else
    {
      b[1]='1';b[2]='A';b[3]='3';b[4]='A';b[5]='C';lungime=5;
    }
  }
  else
  if(a[1]==2)
  {
    if(n==1)
    {
      b[1]='2';lungime=1;
    }
    else
    {
      b[1]='2';b[2]='B';lungime=2;
    }
  }
  else
  {
    if(n==1)
    {
      b[1]='3';
      lungime=1;
    }
    else
    {
      b[1]='3';b[2]='B';b[3]='C';lungime=3;
    }
  }
}

int rezolva()
{
  int valf=1;
  for(int i=1;i<=n&&valf;++i)
  {
    if(b[i]=='A')
    {
      if(a[i]==1)
       b[i]='1';
      else
      if(a[i]==2)
       b[i]='2';
      else
       b[i]='3';
    }
    else
    if(b[i]=='B')
    {
      if(a[i]==2)
      {
        for(int j=lungime;j>=i;--j)
          b[j+1]=b[j];
        ++lungime;
        b[i]='2';
        b[i+1]='B';
      }
      else
      if(a[i]==1)
      {
         for(int j=lungime;j>=i;--j)
           b[j+4]=b[j];
         lungime+=4;
         b[i]='1';
         b[i+1]='A';
         b[i+2]='3';
         b[i+3]='A';
         b[i+4]='C';
      }
      else
        valf=0;
    }
    else
    if(b[i]=='C')
    {
      if(a[i]==2)
        b[i]='2';
      else
      if(a[i]==3)
      {
         for(int j=lungime;j>=i;--j)
           b[j+2]=b[j];
         lungime+=2;
         b[i]='3';
         b[i+1]='B';
         b[i+2]='C';
      }
      else
      {
        for(int j=lungime;j>=i;--j)
          b[j+2]=b[j];
        lungime+=2;
        b[i]='1';
        b[i+1]='2';
        b[i+2]='A';
      }
    }
    if((b[i]=='1'||b[i]=='2'||b[i]=='3')&&(b[i]!=a[i]+'0'))
    {
      valf=0;
      break;
    }
  }
  if(b[n+1]!='\0')
    valf=0;
  return valf;
}