Cod sursa(job #3282605)

Utilizator stefan_dore_Stefan Dore stefan_dore_ Data 6 martie 2025 10:46:47
Problema Perle Scor 100
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 1.67 kb
#include <iostream>
#include <fstream>
using namespace std;

ifstream f ("perle.in");
ofstream g ("perle.out");

const int CMAX = 10000;
int N, lgS, ptr, V[CMAX+1];
bool okA, okB, okC, ok;

bool A();
bool B();
bool C();

bool A() {
    if (ptr > lgS) return 0;
    if (V[ptr] == 1 || V[ptr] == 2 || V[ptr] == 3) {
        ptr++;
        return 1;
    } else
        return 0;
}

bool B() {
    if (ptr > lgS) return 0;
    if (V[ptr] == 2) {
        ptr++;
        return B();
    } else if (V[ptr] == 1) {
        ptr++;
        bool ok = A();
        if (!ok || V[ptr] != 3) return 0;
        ptr++;
        ok = A();
        if (!ok) return 0;
        return C();
    } else
        return 0;
}

bool C() {
    if (ptr > lgS) return 0;
    if (V[ptr] == 2) {
        ptr++;
        return 1;
    } else if (V[ptr] == 1) {
        ptr++;
        if (V[ptr] == 2) {
            ptr++;
            return A();
        } else {
            ptr++;
            return 0;
        }
    } else {
        ptr++;
        bool ok = B();
        if (!ok) return 0;
        return C();
    }
}

int main()
{
    int x;
    f >> N;
    for (int i=1; i<=N; i++) {
        f >> lgS;
        for (int i=1; i<=lgS; i++)
            f >> V[i];
        //
        ok = 0;
        ptr = 1;
        if (A() == 1 && ptr == lgS+1) ok = 1;
        ptr = 1;
        if (B() == 1 && ptr == lgS+1) ok = 1;
        ptr = 1;
        if (C() == 1 && ptr == lgS+1) ok = 1;
        //
        g << ok << '\n';
    }
    f.close();
    g.close();
    return 0;
}

/**

<A> := 1 | 2 | 3
<B> := 2<B> | 1<A>3<A><C>
<C> := 2 | 3<B><C> | 12<A>

*/