Cod sursa(job #94640)

Utilizator piroslPiros Lucian pirosl Data 24 octombrie 2007 15:47:02
Problema Perle Scor 10
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.81 kb
#include <stdio.h>
#include <stdlib.h>
#include <stack>
using namespace std;

int num[10002];

int main(void)
{
	FILE* fin;
	FILE* fout;
	fin = fopen("perle.in", "r");
	fout = fopen("perle.out", "w");

	stack<int> perle;
	stack<int> transf;

	int n;
	fscanf(fin, "%d\n", &n);
	for(int i=0;i<n;++i)
	{
		int l;
		fscanf(fin, "%d ", &l);
		for(int j=0;j<l;++j)
		{
			int k;
			fscanf(fin, "%d ", &k);
			num[j] = k;
		}
		if(l == 1)
		{
			fprintf(fout, "1\n");
		}
		else
		{
			while(!perle.empty())
				perle.pop();
			while(!transf.empty())
				transf.pop();

			for(int j=l-1;j>=0;--j)
				perle.push(num[j]);
		
			switch(num[0]) {
				case 1:
					if(l>=2) {
						if(num[1] == 2)
							transf.push('c');
						else
							transf.push('b');
					}
					else
					{
						transf.push('c');
					}
					break;
				case 2:
					transf.push('b');
					break;
				case 3:
					transf.push('c');
					break;
			}

			while(!perle.empty())
			{
				int p = perle.top();
				int t = transf.top();
				perle.pop();
				transf.pop();
				if(p != t && t != 'a') 
				{
					if(t != 'b' && t != 'c')
						break;

					if(p == 1)
					{
						if(t == 'b')
						{
							transf.push('c');
							transf.push('a');
							transf.push(3);
							transf.push('a');
						}
						if(t == 'c')
						{
							transf.push('a');
							transf.push(2);
						}
					}
					if(p == 2)
					{
						if(t == 'b')
							transf.push('b');
						else
							break;
					}
					if(p == 3)
					{
						if(t == 'c')
						{
							transf.push('c');
							transf.push('b');
						}
						else
							break;
					}
				}
			}
			if(transf.empty())
				fprintf(fout, "1\n");
			else
				fprintf(fout, "0\n");
		}
	}

	fclose(fin);
	fclose(fout);
	return 0;
}