Cod sursa(job #166951)

Utilizator DorinOltean Dorin Dorin Data 28 martie 2008 18:35:51
Problema Perle Scor 100
Compilator c Status done
Runda Arhiva de probleme Marime 2.62 kb
#include <stdio.h>
#define NMAX 10000
int st[2][NMAX+10]; /* 1, 2, 3 e evident si 4, 5, 6 e A, B, C */

int main(void)
{
int t,l,v,i;
int niv[2];
int valid[2];
freopen("perle.in","r",stdin);
freopen("perle.out","w",stdout);
scanf("%d",&t);
while (t--)
      {
       scanf("%d",&l);
       if (l == 1)
          {scanf("%d",&v);
           printf("1\n");
           continue;         }
           else
           {
            valid[1] = valid[0] = 1;
            niv[1] = niv[0] = 1;
            st[0][0] = 5;
            st[1][0] = 6;
            while (l--)
                  {
                   scanf("%d",&v);
                    for (i = 0; i < 2; i++) /* trist da doar 2 valori vreau */
                        {
                         if (valid[i])
                            {
                             if (st[i][niv[i]-1] < 4)
                               {
                                valid[i] = (st[i][--niv[i]]==v);
                                continue;
                               }

                             if (st[i][niv[i]-1] == 4)
                                 {
                                  niv[i]--;
                                  continue;
                                 }

                            if (st[i][niv[i]-1]==5)
                               {
                                if (v == 3) valid[i] = 0;
                                if (v == 1)
                                   {
                                    niv[i]--;
                                    st[i][niv[i]++] = 6;
                                    st[i][niv[i]++] = 4;
                                    st[i][niv[i]++] = 3;
                                    st[i][niv[i]++] = 4;
                                   }
                            /* 2-ul e ok :D */
                            continue;
                           }

                     /* e C in stiva */
                    if (v == 2) niv[i]--;
                    if (v == 1)
                       {
                         niv[i]--;
                         st[i][niv[i]++] = 4;
                         st[i][niv[i]++] = 2;
                        }
                   if (v == 3)
                      {
                        niv[i]--;
                        st[i][niv[i]++] = 6;
                        st[i][niv[i]++] = 5;
                       }

                 }
            if (!niv[i] && l) valid[i] = 0;
                                }
                       }
       printf("%d\n",((!niv[0] && valid[0]) || (!niv[1] && valid[1])));
           }
}
return 0;
}