Cod sursa(job #552797)

Utilizator Catah15Catalin Haidau Catah15 Data 12 martie 2011 20:55:10
Problema Perle Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.61 kb
#include <iostream>
#include <fstream>
#include <string>

using namespace std;

#define maxL 10010


int T, leng, a[maxL], poz;

int verif_C ();


char start ()
{
	if (leng == 1)
		return 'A';
	
	if (a[1] == 2)
		return 'B';
	
	if (a[1] == 1 && a[2] == 2 && leng == 3)
		return 'C';
	
	if (a[1] == 3)
		return 'C';
	
	if (a[1] == 1)
		return 'B';
}


inline int verif_A ()
{
	if (poz > leng)
		return 0;
	
	++ poz;
	
	return 1;
}


int verif_B ()
{
	if (poz > leng)
		return 0;
	
	if (a[poz] == 2)
	{
		++ poz;
		return verif_B ();
	}
	
	if (a[poz] == 1)
	{
		++ poz;
		
		if ( ! verif_A () )
			return 0;
		
		if (poz > leng)
			return 0;
		
		if (a[poz] != 3)
			return 0;
		
		++ poz;
		
		if ( ! verif_A () )
			return 0;
		
		return verif_C ();
		
	}
	
	return 0;
}


int verif_C ()
{
	if (poz > leng)
		return 0;
	
	if (a[poz] == 2)
	{	
		++ poz;
		return 1;
	}
	
	if (a[poz] == 3)
	{
		++ poz;
		
		if ( ! verif_B () )
			return 0;
		
		return verif_C ();
	}
	
	if (a[poz] == 1)
	{
		++ poz;
		
		if (a[poz] != 2 || poz > leng)
			return 0;
		
		++ poz;
		
		return verif_A ();
	}
	
	return 0;
}


int main()
{
	ifstream f("perle.in");
	ofstream g("perle.out");
	
	f >> T;
	
	for (int i = 1; i <= T; ++ i)
	{
		char st;
		
		f >> leng;
		
		for (int j = 1; j <= leng; ++ j)
			f >> a[j];
		
		st = start ();
		
		poz = 1;
		
		if (st == 'A')
			g << verif_A () << '\n';
		
		if (st == 'B')
			g << verif_B () << '\n';
		
		if (st == 'C')
			g << verif_C () << '\n';
		
	}
		
	
	return 0;
}