Cod sursa(job #41641)

Utilizator plastikDan George Filimon plastik Data 28 martie 2007 14:06:56
Problema Perle Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.07 kb
#include <cstdio>

int T, N;
const int MAX_N = 10005;
int eval[MAX_N];

bool A(int &k) {
	if (k >= N)
		return false;
	++ k;
	return true;
}

bool C(int &k);

bool B(int &k) {
	if (k >= N)
		return false;
	if (eval[k] == 3)
		return false;
	if (eval[k] == 1) {
		++ k;
		A(k);
		if (eval[k] != 3)
			return false;
		++ k;
		A(k);
		return C(k);
	}
	if (eval[k] == 2) {
		++ k;
		return B(k);
	}
}

bool C(int &k) {
	if (eval[k] == 1) {
		++ k;
		if (eval[k] != 2)
			return false;
		++ k;
		return A(k);
	}
	if (eval[k] == 2) {
		++ k;
		return true;
	}
	if (eval[k] == 3) {
		++ k;
		if (B(k) == false)
			return false;
		return C(k);
	}
}

int Try(void) {
	if (N == 1)
		return 1;
	int k = 0;
	bool yes = B(k);
	if (yes == true && k == N)
		return 1;
	k = 0;
	return (C(k) && k == N);
}

int main(void) {
	FILE *in = fopen("perle.in", "r"),
	     *out = fopen("perle.out", "w");
	fscanf(in, "%d", &T);
	int i, j;
	for (i = 0; i < T; ++ i) {
		fscanf(in, "%d", &N);
		for (j = 0; j < N; ++ j)
			fscanf(in, "%d", &eval[j]);
		fprintf(out, "%d\n", Try());
	}
	fclose(in);
	fclose(out);

	return 0;
}