Cod sursa(job #2815629)

Utilizator divadddDavid Curca divaddd Data 9 decembrie 2021 22:31:00
Problema Perle Scor 10
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 3.99 kb
#include <iostream>
#include <fstream>
#include <string>
#define MAX 20002
using namespace std;
string s = "";
int n,l,v[MAX],k,sol;

/**
A -> 1 | 2 | 3
B -> 2B | 1A3AC
C -> 2 | 3BC | 12A
**/

ifstream fin("perle.in");
ofstream fout("perle.out");

bool esteBun(int k){
    if(s.size() != l){
        return false;
    }
    /// vedem epntru fiecare caracter daca s[i] == v[i+1]
    for(int i = 0; i < k; i++){
        int val = 0;
        /// val = -1, nu este bun, adica nu se afla nici o cifra, nici a, dar alta cifra precum
        /// val = 0...9, este o cifra
        /// val = 10, poate fi orice cifre
        if(s[i] == 'A'){
            continue;
        }
        val = s[i]-'0';
        if(val != v[i+1]){
            return false;
        }
    }
    return true;
}
void a(); /// posibil ne folosita
void b(int index);
void c(int index);
bool exista();

int main()
{
    fin >> n;
    for(int i = 1; i <= n; i++){
        fin >> l;
        for(int j = 1; j <= l; j++){
            fin >> v[j];
        }
        /// aici intra rezolvarea
        /// NOTE: un sir nu poate incepe nicio data cu A
        /// daca incepe cu A sirul va avea lungimea = 1
        fout << exista() << "\n";
    }
    return 0;
}

void b(int index){
    /// B -> 2B | 1A3AC
    //cout << s << ", " << k << "\n";
    if(esteBun(k) && sol == 0){
        sol = 1;
    }
    string copie = s;
    int ck = k;
    if(sol == 0 && k <= l && v[index] == 2){
        /// adaugam 2B pe pozitia index
        if(s.length() != 0){
            s.erase(index-1);
        }else{
            k++;
        }
        s.insert(index-1, "2B");
        k++;
        b(index+1);
    }
    if(esteBun(k) && sol == 0){
        sol = 1;
    }
    k = ck;
    s = copie;
    if(sol == 0 && k <= l && v[index] == 1){
        /// adaugam 1A3AC pe pozitia index
        if(s.length() != 0){
            s.erase(index-1);
        }else{
            k++;
        }
        s.insert(index-1, "1A3AC");
        k += 4;
        c(index+4);
    }
    if(esteBun(k) && sol == 0){
        sol = 1;
    }
    k = ck;
    s = copie;
}

void c(int index){
    /// C -> 2 | 3BC | 12A
    if(esteBun(k) && sol == 0){
        sol = 1;
    }
    string copie = s;
    int ck = k;
    if(sol == 0 && k <= l && v[index] == 2){
        /// adaugam 2 pe pozitia index
        if(s.length() != 0){
            s.erase(index-1);
        }else{
            k++;
        }
        s.insert(index-1, "2");
        /// k ramane la fel pt stergem pe C si il inlocuim cu 2
    }
    if(esteBun(k) && sol == 0){
        sol = 1;
    }
    k = ck;
    s = copie;
    if(sol == 0 && k <= l && v[index] == 3){
        /// adaugam 3BC pe pozitia index
        if(s.length() != 0){
            s.erase(index-1);
        }else{
            k++;
        }
        s.insert(index-1, "3BC");
        k += 2;
        b(index+1);
        c(index+1);
    }
    if(esteBun(k) && sol == 0){
        sol = 1;
    }
    k = ck;
    s = copie;
    if(sol == 0 && k <= l && v[index] == 1){
        /// adaugam 12A pe pozitia index
        if(s.length() != 0){
            s.erase(index-1);
        }else{
            k++;
        }
        s.insert(index-1, "12A");
        k += 2;
    }
    //cout << s << ", " << k << ", " << esteBun(k) << "!\n";
    if(esteBun(k) && sol == 0){
        sol = 1;
    }
    k = ck;
    s = copie;
}

bool exista(){
    bool r = false;
    if(l == 1){
        return true;
    }
    /// presupunem ca nu exista si in timp ce generam vedem daca presupunerea a fost gresita
    k = 0, sol = 0; /// resetam nr de elemente si variabila GLOBALA care ne zice daca a fost gasit ceva
    b(1); /// incepem un "sir de perle" care incepe cu B
    if(sol == 1){
        return true;
    }
    if(sol == 0){
        /// generam din nou daca nu a fost gasit deja
        k = 0;
        c(1); /// incepem altul dar de data asta incepe cu C
    }
    r = (sol == 1);
    return r;
}