Cod sursa(job #468470)

Utilizator savimSerban Andrei Stan savim Data 3 iulie 2010 19:56:11
Problema Perle Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.7 kb
#include <stdio.h>
#include <string.h>
#include <algorithm>

using namespace std;

#define MAX_N 10010

int n, T;
int sir[MAX_N];
char cover[MAX_N];

int pearl(char lit) {
	memset(cover, 0, sizeof(cover));

	cover[1] = lit;

	int len = 1;
	for (int i = 1; i <= n; i++) {
		if (cover[i] == 'A')
			cover[i] = '*';

		if (cover[i] == 'B') {
			if (sir[i] == 3)
				return 0;

			if (sir[i] == 2) {
				for (int j = len; j >= i; j--)
					cover[j + 1] = cover[j];
				len += 1;

				cover[i] = '*'; cover[i + 1] = 'B';
			}

			if (sir[i] == 1) {
				for (int j = len; j >= i; j--)
					cover[j + 4] = cover[j];
				len += 4;

				if (sir[i + 2] != 3)
					return 0;

				for (int j = i; j < i + 4; j++)
					cover[j] = '*';
				cover[i + 4] = 'C';
			}
		}
		
		if (cover[i] == 'C') {
			if (sir[i] == 2)
				cover[i] = '*';

			if (sir[i] == 3) {
				for (int j = len; j >= i; j--)
					cover[j + 2] = cover[j];
				len += 2;

				cover[i] = '*'; cover[i + 1] = 'B'; cover[i + 2] = 'C';
			}

			if (sir[i] == 1) {
				for (int j = len; j >= i; j--)
					cover[j + 2] = cover[j];
				len += 2;
				
				if (sir[i + 1] != 2)
					return 0;

				cover[i] = cover[i + 1] = cover[i + 2] = '*';
			}
		}
	}

	int ok = 1;
	for (int i = 1; i <= n; i++)
		if (cover[i] != '*')
			ok = 0;

	if (len == n && ok == 1) 
		return 1;
	return 0;
}

int main() {

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

	scanf("%d", &T);
	for (; T; T--) {
		scanf("%d", &n);
		memset(sir, 0, sizeof(sir));
		for (int i = 1; i <= n; i++)
			scanf("%d", &sir[i]);

		printf("%d\n", max(pearl('A'), max(pearl('B'), pearl('C'))));
	}

	return 0;
}