Cod sursa(job #1373482)

Utilizator Cristian1997Vintur Cristian Cristian1997 Data 4 martie 2015 18:59:48
Problema Perle Scor 10
Compilator cpp Status done
Runda Arhiva de probleme Marime 3.22 kb
#include <fstream>
#include <string.h>
using namespace std;
#define lgMax 10000

int lg;
char s[lgMax], temp[lgMax + 15];

bool transf(char) ;

int main()
{
    int i, j, n, perla, ok;
    
    freopen("perle.in", "r", stdin);
    freopen("perle.out", "w", stdout);
    
    scanf("%d", &n);
    for(i = 0; i < n; ++i)
    {
        scanf("%d", &lg);
        for(j = 0; j < lg; ++j) scanf("%s ", s + j);
        
        ok = 0;
        for(perla = 0; perla < 3 && !ok; ++perla)
            if(transf(char('A' + perla))) ok = 1;
        
        if(ok) printf("1\n");
        else printf("0\n");
    }
    
    return 0;
}

bool transf(char c)
{
    int lgTemp = 1, i, j;
    
    for(temp[0] = c, j = 0; j < lgTemp; ++j)
    {
        if(s[j] == temp[j]) continue;
        if('1' <= temp[j] && temp[j] <= '3') return 0;
        if('A' <= s[j] && s[j] <= 'C') return 0;
        if(lgTemp > lg) return 0;
        
        switch(temp[j])
        {
            case 'A': temp[j] = s[j]; break;
            case 'B':
            {
                switch(s[j])
                {
                    case '1':
                    {
                        if(lgTemp + 4 > lg) return 0;
                        else
                        {
                            for(i = lgTemp - 1; i > j; --i) temp[i + 4] = temp[i];
                            strcpy(temp + j, "1A3AC");
                            lgTemp += 4;
                        }
                        break;
                    }
                    case '2':
                    {
                        if(lgTemp + 1 > lg) return 0;
                        else
                        {
                            for(i = lgTemp - 1; i > j; --i) temp[i + 1] = temp[i];
                            strcpy(temp + j, "2B");
                            lgTemp++;
                        }
                        break;
                    }
                    case '3': return 0;
                }
                break;
            }
            case 'C':
            {
                switch(s[j])
                {
                    case '1':
                    {
                        if(lgTemp + 2 > lg) return 0;
                        else
                        {
                            for(i = lgTemp - 1; i > j; --i) temp[i + 2] = temp[i];
                            strcpy(temp + j, "12A");
                            lgTemp += 2;
                        }
                        break;
                    }
                    case '2':
                    {
                        temp[j] = '2';
                        break;
                    }
                    case '3':
                    {
                        if(lgTemp + 2 > lg) return 0;
                        else
                        {
                            for(i = lgTemp - 1; i > j; --i) temp[i + 2] = temp[i];
                            strcpy(temp + j, "3BC");
                            lgTemp++;
                        }
                        break;
                    }
                }
                break;
            }
        }
    }
    
    if(lgTemp == lg) return 1;
    return 0;
}