Cod sursa(job #56795)

Utilizator DastasIonescu Vlad Dastas Data 30 aprilie 2007 14:41:20
Problema Perle Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 2.44 kb
#include <cstdio>
#include <cstring>

FILE *in = fopen("perle.in", "r"), *out = fopen("perle.out", "w");

int n;
int a[11][10001];
int t = 0, poz = 0;

void verifica(int i, char *s)
{
    if ( s[0]=='b' )
    {
         switch ( a[i][poz] )
         {
            case 2:
                poz++;
                verifica(i, "b");
                break;
            case 1:
                if ( poz+4 <= a[i][0] && a[i][poz+2] == 3 )
                {
                    poz += 4;
                    verifica(i, "c");
                }
                break;
         }
    }
    else
    if ( s[0] == 'c' )
    {
        if ( poz + 2 < a[i][0] && a[i][poz] == 3 )
        {
              poz++;
              verifica(i, "bc");
        }
        else
        {
            switch( a[i][poz] )
            {
                case 1:
                    if ( poz+2 <= a[i][0] && a[i][poz+1] == 2 )
                    {
                        poz += 2;
                        t = 1;
                    }
                    break;
                case 2:
                    t = 1;
                    break;
            }
        }
    }

    if ( t )
    {
        if ( strlen(s) > 1 && poz > a[i][0] )
            t = 0;
        else
        if ( strlen(s) > 1 && poz < a[i][0])
        {
            t = 0;
            poz++;
            verifica(i, s+1);
        }
    }
}

int main()
{
    fscanf(in, "%d", &n);

    for ( int i = 0; i < n; ++i )
    {
        fscanf(in, "%d", &a[i][0]);
        for ( int j = 1; j <= a[i][0]; ++j )
            fscanf(in, "%d", &a[i][j]);
    }

    for ( int i = 0; i < n; ++i )
    {
        t = 0;
        if( a[i][0] == 1 )
            fprintf(out, "%d\n", 1);
        else
        {
            t = 0;
            switch ( a[i][1] )
            {
            case 2:
                poz = 2;
                verifica(i, "b");
                break;
            case 1:
                if ( a[i][0] == 3 && a[i][2] == 2 )
                    t = 1;
                else
                if ( a[i][0] > 4 && a[i][3] == 3 )
                {
                    poz = 5;
                    verifica(i, "c");
                }
                break;
            case 3:
                poz = 2;
                verifica(i, "bc");
                break;
            }
            fprintf(out, "%d\n", t);
        }
    }

    return 0;
}