Cod sursa(job #2006729)

Utilizator Coroian_DavidCoroian David Coroian_David Data 31 iulie 2017 14:02:25
Problema Perle Scor 50
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.57 kb
#include <cstdio>

using namespace std;

FILE *f, *g;

int n;

int a[10009];

bool pos(int len, int dr, int cr)
{
    if(len > dr)
        return 0;

    if(cr == 1)
        return (dr == len);

    if(cr == 2)
    {
        if(a[len] == 2)
            return pos(len + 1, dr, 2);

        if(a[len] == 1 && len + 4 <= dr)
            return (a[len + 2] == 3 && pos(len + 4, dr, 3));
    }

    if(cr == 3)
    {
        if(a[len] == 2 && dr == len)
            return 1;

        if(a[len] == 1 && dr - len + 1 == 3 && a[len + 1] == 2)
            return 1;

        if(a[len] == 3)
        {
            int i, ok = 0;
            for(i = len + 1; i < dr; i ++)
            {
                ok = ok || (pos(len + 1, i, 2) && pos(i + 1, dr, 3));

                if(ok == 1)
                    return 1;
            }

            return ok;
        }
    }

    return 0;
}

void ansQues()
{
    f = fopen("perle.in", "r");
    g = fopen("perle.out", "w");

    int t;
    fscanf(f, "%d", &t);

    while(t > 0)
    {
        t --;

        fscanf(f, "%d", &n);

        int i;
        for(i = 1; i <= n; i ++)
            fscanf(f, "%d", &a[i]);

        if(pos(1, n, 1) == 1)
            fprintf(g, "1\n");

        else
            if(pos(1, n, 2) == 1)
                fprintf(g, "1\n");

        else
            if(pos(1, n, 3) == 1)
                fprintf(g, "1\n");

        else
            fprintf(g, "0\n");
    }

    fclose(f);
    fclose(g);
}

int main()
{
    ansQues();

    return 0;
}