Cod sursa(job #560700)

Utilizator maritimCristian Lambru maritim Data 18 martie 2011 17:26:09
Problema Perle Scor 30
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.7 kb
#include<stdio.h>
#include<malloc.h>

typedef struct _nod
{
	short int info;
	struct _nod *adr;
} nod;

int N;
int M;
short int V[10002];

void add(int i,nod*& Ci)
{
	nod *nou = (nod*)malloc(sizeof(nod));
	nou->info = i;
	nou->adr = Ci;
	Ci = nou;
}

int incercare(void)
{
	nod *q;
	if(M == 1)
		return 1;
	else if(M == 2)
		return 0;
	else if(M == 3)
	{
		if(V[1] == 1 && V[2] == 2)
			return 1;
		else
			return 0;
	}
	else if(M == 4)
		return 0;
	else
	{
		nod *Ci = NULL;
		int i = 1;
		if(V[i] == 1 && V[i+2] == 3)
		{
			add(3,Ci);
			i += 4;
		}
		else if(V[i] == 2)
		{
			add(2,Ci);
			i ++;
		}
		else if(V[i] == 3)
		{
			add(3,Ci);
			add(2,Ci);
			i ++;
		}
		else return 0;
		while(Ci && i<M)
		{
		q = Ci;
		if(V[i] == 1 && V[i+2] == 3 && Ci->info == 2)
		{
			Ci = Ci->adr;
			free(q);
			add(3,Ci);
			i += 4;
		}
		else if(V[i] == 2 && Ci->info == 2)
		{
			Ci = Ci->adr;
			free(q);
			add(2,Ci);
			i ++;
		}
		else if(V[i] == 3 && Ci->info == 3)
		{
			Ci = Ci->adr;
			free(q);
			add(3,Ci);
			add(2,Ci);
			i ++;
		}
		else if(V[i] == 1 && V[i+1] == 2 && Ci->info == 3)
		{
			Ci = Ci->adr;
			free(q);
			i += 3;
		}
		else if(V[i] == 2 && Ci->info == 3)
		{
			Ci = Ci->adr;
			free(q);
			i ++;
		}
		else return 0;
		}
		if(!Ci || i>M)
			return 1;
		else
			return 0;
	}
	
}

void citire(void)
{
	FILE *f = fopen("perle.in","r");
	FILE *g = fopen("perle.out","w");
	
	fscanf(f,"%d ",&N);
	for(int i=1;i<=N;i++)
	{
		fscanf(f,"%d",&M);
		for(int j=1;j<=M;j++)
			fscanf(f,"%d",&V[j]);
		fprintf(g,"%d\n",incercare());
	}
	
	fclose(g);
	fclose(f);
}

int main()
{
	citire();
	return 0;
}