Cod sursa(job #2707890)

Utilizator raizoSoare Antonio raizo Data 17 februarie 2021 21:47:21
Problema Perle Scor 10
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 1.97 kb
#include <iostream>
#include <vector>
#include <string>
#include <fstream>

using namespace std;

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


bool B(vector<int>& v, int& s);
bool C(vector<int>& v, int& s);

bool C(vector<int>& v, int& s) {
	if (v[v.size() - 1] == 2 && v.size() == s) { return 1; }
	else if (v[v.size() - 2] == 2 && v[v.size() - 3] == 1 && v.size() == s + 2) { 
		s += 2;
		return 1;
	}
	else if (s+2 < v.size()) {
		if (v[s - 1] == 3) { 
			s += 1;
			if (B(v, s)) {
				s += 1;
				return C(v, s);
			}
			else { return 0; }
		}
		else { return 0; }
	}
	else { return 0; }
}



bool B(vector<int>& v,int& s) {
	if (s + 1 < v.size()) {
		if (v[s - 1] == 2) {
			s += 1;
			return B(v, s);
		}
		else if (s + 4 < v.size()) {
			s += 4;
			if (v[s-5] == 1 && v[s-3] == 3) {
				return C(v, s);
			}
			else { return 0; }
		}
		else { return 0; }
	}
	else { return 0; }
}


int perle(vector<int>& v) {
	int s;
	if (v.size() == 1) { return 1; }
	else if (v.size() == 2 || v.size() == 4) { return 0; }
	else if (v.size() == 3) {
		if (v[0] == 1 && v[1] == 2) { return 1; }
		else { return 0; }
	}
	else if (v[0] == 1 && v[2]==3) {
		s = 5;
		if (v[v.size() - 1] == 2 && v.size()==s) { return 1; }
		else if (v[v.size() - 2] == 2 && v[v.size() - 3] == 1 && v.size()==s+2) { return 1; }
		else if(s < v.size()){
			if (v[s - 1] == 3) {
				s += 1;
				if (B(v, s)) {
					s += 1;
					return C(v, s);
				}
				else { return 0; }
			}
			else { return 0; }
		}
		else { return 0; }
	}
	else if (v[0] == 2) {
		s = 2;
		return B(v, s);
	}
	else if (v[0] == 3) {
		s = 2;
		if (B(v, s)) {
			s += 1;
			return C(v, s);
		}
		else { return 0; }
	}
	else { return 0; }

}

int main()
{
	int N,n,nr;
	vector<int> v;
	in >> N;
	for (int i = 0;i < N;i++) {
		in >> n;
		for (int j = 0;j < n;j++) {
			in >> nr;
			v.push_back(nr);
		}
		out << perle(v) << endl;
		v.clear();
	}

	return 0;
}