Cod sursa(job #13073)

Utilizator crawlerPuni Andrei Paul crawler Data 5 februarie 2007 16:04:01
Problema Perle Scor 40
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.51 kb
#include <stdio.h>
#include <string.h>

#define FIN "perle.in"
#define FOUT "perle.out"
#define nmax 100001

int v[nmax], s[nmax], poz,N,SOL;

void putB();
void putC();

void putA()
 {
  s[poz]=v[poz];
  ++poz;
 }

void putB()
 {
  if(v[poz]==2)
   {
    s[poz]=2;
    ++poz;
    putB();
   }
    else
   if(v[poz]==1)
   {
    s[poz]=1;
    ++poz;
    putA();
    if(v[poz]==3)
     {
      s[poz]=3;
      ++poz;
      putA();
      putC();
     }
      else
     SOL=-1;
   }
    else
   SOL=-1;
 }

void putC()
 {
  if(v[poz]==2)
   s[poz]=2;
    else
  if(v[poz]==3)
   {
    s[poz]=3;
    ++poz;
    putB();
    putC();
   }
    else
   {
    s[poz]=1;
    ++poz;
    if(v[poz]!=2)
     SOL=-1;
      else
     {
      s[poz]=2;
      ++poz;
     }
    putA();
   }
    
 }

void rez()
 {
  if(v[poz]==1)
   {
    if(s[0]==1)
    putA();
     else
    if(s[0]==3)
    putC();
     else
    putB();
   }
    else
  if(v[poz]==2)
   {
    if(s[0]==1)
    putA();
     else
    putB();
   }
    else
   if(s[0]==1)
    putA();
     else
    putC();
 }

int main()
 {
  freopen(FIN,"r",stdin);
  freopen(FOUT,"w",stdout);

  int i,j,T;

  scanf("%d", &T);

  for(i=1;i<=T;++i)
   {
    scanf("%d", &N);
    
    for(j=1;j<=N;++j)
     scanf("%d", &v[j]);
     
    memset(&s,0,sizeof(s));
    s[0]=N;  poz=1;
    SOL=0;
    rez();
    if(!SOL)
     printf("1\n");
      else
     printf("0\n");
   }

  return 0;
 }