Pagini recente » Cod sursa (job #1821849) | Cod sursa (job #71089) | Cod sursa (job #1004429) | Cod sursa (job #954984) | Cod sursa (job #2815764)
#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;
}
if(sol == 0 && k <= l && v[index] == 2){
/// adaugam 2B pe pozitia index
if(s.length() != 0){
s.erase(index-1, 1);
}else{
k++;
}
s.insert(index-1, "2B");
k++;
b(index+1);
}
if(esteBun(k) && sol == 0){
sol = 1;
}
if(sol == 0 && k <= l && v[index] == 1){
/// adaugam 1A3AC pe pozitia index
if(s.length() != 0){
s.erase(index-1, 1);
}else{
k++;
}
s.insert(index-1, "1A3AC");
k += 4;
c(index+4);
}
if(esteBun(k) && sol == 0){
sol = 1;
}
}
void c(int index){
/// C -> 2 | 3BC | 12A
if(esteBun(k) && sol == 0){
sol = 1;
}
if(sol == 0 && k <= l && v[index] == 2){
/// adaugam 2 pe pozitia index
if(s.length() != 0){
s.erase(index-1, 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;
}
if(sol == 0 && k <= l && v[index] == 3){
/// adaugam 3BC pe pozitia index
if(s.length() != 0){
s.erase(index-1, 1);
}else{
k++;
}
s.insert(index-1, "3BC");
k += 2;
b(index+1);
c(s.find('C')+1);
}
if(esteBun(k) && sol == 0){
sol = 1;
}
if(sol == 0 && k <= l && v[index] == 1){
/// adaugam 12A pe pozitia index
if(s.length() != 0){
s.erase(index-1, 1);
}else{
k++;
}
s.insert(index-1, "12A");
k += 2;
}
//cout << s << ", " << k << ", " << esteBun(k) << "!\n";
if(esteBun(k) && sol == 0){
sol = 1;
}
}
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
s = "", 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
s = "", k = 0;
c(1); /// incepem altul dar de data asta incepe cu C
}
r = (sol == 1);
return r;
}