Cod sursa(job #651489)

Utilizator a_h1926Heidelbacher Andrei a_h1926 Data 20 decembrie 2011 17:14:37
Problema Perle Scor 10
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.81 kb
#include <cstdio>

#define NMax 10005

using namespace std;

const int A=4, B=5, C=6;
int X[NMax];

inline bool ValidA (int x)
{
    if (1<=x and x<=A)
    {
        return true;
    }
    return false;
}

inline bool ValidB (int x)
{
    if (x==B)
    {
        return true;
    }
    return false;
}

inline bool ValidC (int x)
{
    if (x==2 or x==C)
    {
        return true;
    }
    return false;
}

inline bool Valid1 (int x)
{
    if (x==1 or x==A)
    {
        return true;
    }
    return false;
}

inline bool Valid2 (int x)
{
    if (x==2 or x==A or x==C)
    {
        return true;
    }
    return false;
}

inline bool Valid3 (int x)
{
    if (x==3 or x==A)
    {
        return true;
    }
}

int Evaluate (int L)
{
    if (L==1)
    {
        return 1;
    }
    if (ValidB (X[L]) and Valid2 (X[L-1]))
    {
        X[L-1]=B;
        return Evaluate (L-1);
    }
    if (L<3)
    {
        return 0;
    }
    if (ValidA (X[L]) and Valid2 (X[L-1]) and Valid1 (X[L-2]))
    {
        X[L-2]=C;
        return Evaluate (L-2);
    }
    if (ValidC (X[L]) and ValidB (X[L-1]) and Valid3 (X[L-2]))
    {
        X[L-2]=C;
        return Evaluate (L-2);
    }
    if (L<5)
    {
        return 0;
    }
    if (ValidC (X[L]) and ValidA (X[L-1]) and Valid3 (X[L-2]) and ValidA (X[L-3]) and Valid1 (X[L-4]))
    {
        X[L-4]=B;
        return Evaluate (L-4);
    }
    return 0;
}

int main()
{
    freopen ("perle.in", "r", stdin);
    freopen ("perle.out", "w", stdout);
    int T;
    scanf ("%d", &T);
    for (; T>0; --T)
    {
        int N;
        scanf ("%d", &N);
        for (int i=1; i<=N; ++i)
        {
            scanf ("%d", &X[i]);
        }
        printf ("%d\n", Evaluate (N));
    }
    return 0;
}