Pagini recente » Cod sursa (job #793419) | Cod sursa (job #1854912) | Cod sursa (job #1536006) | Cod sursa (job #1528770) | Cod sursa (job #2815618)
#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(k != 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] >= '0' && s[i] <= '9'){
val = (s[i]-'0');
}else{
if(s[i] == 'A'){
val = 10;
}else{
val = -1;
}
}
if(val == -1){
return false;
}
if(val != 10 && v[i+1] != val){
/// am gasit o cifra care nu este buna
/// nu coreleaza cu sirul cautat
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){
/// adaugam 2B pe pozitia index
if(s.length() != 0){
s.erase(index-1);
}else{
k++;
}
s.insert(index-1, "2B");
if(k+1 <= l){
k++;
b(index+1);
}
}
if(esteBun(k) && sol == 0){
sol = 1;
}
k = ck;
s = copie;
if(sol == 0 && k < l){
/// adaugam 1A3AC pe pozitia index
if(s.length() != 0){
s.erase(index-1);
}else{
k++;
}
s.insert(index-1, "1A3AC");
if(k+4 <= l){
k += 4;
c(index+4);
}
}
//cout << s << ", " << k << "\n";
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){
/// 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){
/// adaugam 3BC pe pozitia index
if(s.length() != 0){
s.erase(index-1);
}else{
k++;
}
s.insert(index-1, "3BC");
if(k+2 <= l){
k += 2;
b(index+1);
c(index+1);
}
}
if(esteBun(k) && sol == 0){
sol = 1;
}
k = ck;
s = copie;
if(sol == 0 && k < l){
/// 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;
}