Cod sursa(job #66432)

Utilizator tvladTataranu Vlad tvlad Data 18 iunie 2007 14:12:59
Problema Perle Scor 30
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.5 kb
#include <stdio.h>
#include <stdlib.h>

const int N = 10000;

struct elem {
	int val;
	elem* nx;
};

int n,m;
int a[N];

void insert ( int ce, elem* unde ) {
	elem* nxnx = (*unde).nx;
	(*unde).nx = (elem*)malloc(sizeof(elem));
	(*(*unde).nx).val = ce;
	(*(*unde).nx).nx = nxnx;
}

int dezvolta ( int s, int a[] ) {
	elem* st = (elem*)malloc(sizeof(elem));
	elem* c = st;
	(*c).val = s; (*c).nx = NULL;
	int sch = 0;
	for (int i = 0; i<n; ++i) {
		switch ((*c).val) {
			case 4: (*c).val = a[i]; ++sch; break;
			case 5: switch (a[i]) {
						case 1: insert(6,c); insert(4,c); insert(3,c); insert(4,c); (*c).val = 1; break;
						case 2: insert(5,c); (*c).val = 2; break;
						case 3: return 0; break;
					}
					++sch; break;
			case 6: switch (a[i]) {
						case 1: insert(4,c); insert(2,c); (*c).val = 1; break;
						case 2: (*c).val = 2; break;
						case 3: insert(6,c); insert(5,c); (*c).val = 3; break;
					}
					++sch; break;
			default:if (a[i] != (*c).val) return 0;
		}
		if ((*c).nx == NULL && i < n-1) return 0;
		elem* last = c; c = (*c).nx; free(last);
	}
	return (c == NULL) ? sch : 0;
}

int main() {
	freopen("perle.in","r",stdin);
	freopen("perle.out","w",stdout);

	scanf("%d",&m);
	for (int i = 0; i<m; ++i) {
		scanf("%d",&n);
		for (int j = 0; j<n; ++j) {
			scanf("%d",&a[j]);
		}
		int x = dezvolta(4,a);
		int y = dezvolta(5,a); if (y > x) x = y;
		y = dezvolta(5,a); if (y > x) x = y;
                if (x>0) x=1;
		printf("%d\n",x);
	}
}