Cod sursa(job #383878)

Utilizator gabipurcaruGabi Purcaru gabipurcaru Data 18 ianuarie 2010 16:25:02
Problema Perle Scor 20
Compilator cpp Status done
Runda Arhiva de probleme Marime 2.25 kb
#include <fstream>
#include <iostream>
#include <list>
using namespace std;

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

list<char> s;
list<char>::iterator it,it2;
int n,i,l,x[10001],sol,pos,q;

int main()
{
	in>>l;
	while(l--)
	{
		in>>n;
		for(i=1; i<=n; i++)
			in>>x[i];
		s.clear();
		if(n == 1)
			{out<<"1\n";continue;}
		else if(n==2)
			{out<<"0\n";continue;}
		else if(n==3 && x[1] == 1 && x[2] == 2)
			{out<<"1\n";continue;}
		else if(n==3)
			{out<<"0\n";continue;}
		if(x[1] == 1 || x[1] == 2)
			s.push_back('b');
		else if(x[1] == 3)
			s.push_back('c');
		pos = 1;sol=1;it=s.begin();
	
		if(pos>n)
			{sol=0;break;}
		if(pos==n && (s.back() == 'a'  || (s.back() == 'c' && x[n]==2)))
			{sol=1;break;}
		while(1)
		{
			if(pos==n)
				break;
			
			//cout<<(*it2<4)?*it2+'0':*it2;
			cout<<'\n';
			if(*it == 'a')
				*it = x[pos];
			else if(*it == 'b' && x[pos] == 2)
			{
				*it = 2;
				it++;pos++;
				s.insert(it, 'b');
				it--;//it--;
			}
			else if(*it == 'b' && x[pos]== 1)
			{
				*it=1;
				it++;
				s.insert(it,'a');
				s.insert(it,3);
				s.insert(it,'a');
				s.insert(it,'c');
				it--;pos+=4;
			}
			else if(*it == 'b' && x[pos]==3)
				{sol=0;break;}
			else if(*it == 'c' && x[pos]==1)
			{
				if(pos==n-2 && x[pos]==1 && x[pos+1]==2)
					{sol=1;break;}
				else
					{sol=0;break;}
			}
			else if(*it == 'c' && x[pos]== 2)
			{
				*it=2;
				pos++;
				it++;
			}
			else if(*it == 'c' && x[pos] == 3)
			{
				*it=3;
				it++;pos++;
				s.insert(it, 'b');
				s.insert(it, 'c');
				it--;it--;
			}
			for(it2 = s.begin(); it2!=s.end(); it2++)
				if(*it2<6)
					cout<<(int)*it2;
				else
					cout<<*it2;
		}

		if(sol==0)
			{out<<"0\n";break;}
		else
		{
			q = 1;
			for(it = s.begin(); it!=s.end(); it++)
			{
				if(q==n-1)
					break;
				if(*it == 1 && x[q] != 1)
					{sol=0;break;}
				if(*it == 2 && x[q] != 2)
					{sol=0;break;}
					
				q++;
			}
			if(s.back() == 'c' && x[n]!=2)
				sol=0;
			if(s.back() == 'c' && n-pos==2 && x[pos]==1 && x[pos+1]==2)
				sol=1;
			if(*it < 7)
				cout<<"#### "<<*it+'0'<<" ####";
			else
				cout<<"#### "<<(char)*it<<" ####";
			out<<sol<<'\n';
		}
	}
	return 0;
}