Cod sursa(job #3005240)

Utilizator Remus.RughinisRemus Rughinis Remus.Rughinis Data 16 martie 2023 20:36:44
Problema Perle Scor 100
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 1.63 kb
#include <iostream>
#include <fstream>
#include <vector>
#define MAXL 10000

using namespace std;
int v[MAXL], l;

bool solve(int id, vector<char> s){
  if(s.size() == 0){
    if(id == l)
      return 1;
    return 0;
  }
  if(id == l)
    return 0;

  bool r = false;
  char c = s[s.size() - 1];
  s.pop_back();

  if(c == 'B'){
    if(v[id] == 2){ // 2B
      s.push_back('B');
      r |= solve(id + 1, s);
    }

    if(l >= id + 5 && v[id] == 1 && v[id + 2] == 3){ // 1A3AC
      s.push_back('C');
      r |= solve(id + 4, s);
    }
  
  } if(c == 'C'){
    if(v[id] == 2) // 2
      r |= solve(id + 1, s);

    if(l >= id + 3 && v[id] == 3){ // 3BC
      s.push_back('C');
      s.push_back('B');
      r |= solve(id + 1, s);
      s.pop_back();
      s.pop_back();
    }

    if(l >= id + 3 && v[id] == 1 && v[id + 1] == 2)
      r |= solve(id + 3, s);
  }
    
  return r;
}

bool start(){
  if(l == 1)
    return 1;

  bool r;
  vector<char> s;

  if(v[0] == 3){
    s.push_back('C');
    s.push_back('B');
    r = solve(1, s);
  
  } else if(v[0] == 2){
    s.push_back('B');
    r = solve(1, s);
    s.pop_back();

  } else if(v[0] == 1){
    if(l == 3 && v[1] == 2)
      return 1;

    if(l < 5 || v[2] != 3)
      return 0;
    s.push_back('C');
    r |= solve(4, s);
    s.pop_back();
  }
  return r;
}

int main(){
  int n, i, j;
  FILE *fin, *fout;

  fin = fopen("perle.in", "r");
  fout = fopen("perle.out", "w");
  fscanf(fin, "%d", &n);

  for(i = 0; i < n; i ++){
    fscanf(fin, "%d", &l);
    for(j = 0; j < l; j ++){
      fscanf(fin, "%d", &v[j]);
    }
    fprintf(fout, "%d\n", start());
  }
  fclose(fin);
  fclose(fout);

  return 0;
}