Cod sursa(job #17128)

Utilizator cypryCiprian Oprisa cypry Data 14 februarie 2007 21:47:17
Problema Perle Scor 60
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.46 kb
#include<stdio.h>

int v[10001];
int posibil_a(int x,int y);
int posibil_b(int x,int y);
int posibil_c(int x,int y);

int posibil_a(int x,int y)
{
 if(y==x) return 1;
  else return 0;
}

int posibil_b(int x,int y)
{
 if(x>=y) return 0;
 if(v[x]==2)
  return posibil_b(x+1,y);
   else if(v[x]==1)
    {
     if(v[x+2]!=3) return 0;
     return posibil_c(x+4,y);
    }else return 0;
}

int posibil_c(int x,int y)
{
 if(x>y) return 0;
 if(v[x]==2)
  {
   if(x==y) return 1;
    else return 0;
  }
 if(v[x]==1)
  {
   if(v[x+1]!=2 || (y!=x+2)) return 0;
    return 1;
  }
 //v[x] mai poate fi 3 si avem 3BC
 /*while(v[x]==3)
  { */
   x++;
   while(v[x]==2 && x<=y) x++;
   //ar trebui sa mai avem 1A3ACC
   if(v[x]!=1 || v[x+2]!=3) return 0;
   x+=4;
   if(x>y) return 0;
   //secventa ramasa ar trebui sa fie CC
   if(v[x]==2) return posibil_c(x+1,y);
   if(v[x]==1)
    {
     if(v[x+1]!=2) return 0;
      else return posibil_c(x+3,y);
    }
   //iarasi la 3BC
  //}
 return 1;
}

int posibil(void)
{
 if(posibil_a(1,v[0])) return 1;
 if(posibil_b(1,v[0])) return 1;
 if(posibil_c(1,v[0])) return 1;
 return 0;
}


int main()
{
 FILE *fin=fopen("perle.in","r"),*fout=fopen("perle.out","w");
 int n,i,j;
 fscanf(fin,"%d\n",&n);
 for(i=1;i<=n;i++)
  {
   fscanf(fin,"%d",&v[0]);
   for(j=1;j<=v[0];++j)
    fscanf(fin,"%d",&v[j]);
   fprintf(fout,"%d\n",posibil());
  }
 fclose(fin);
 fclose(fout);
 return 0;
}