Cod sursa(job #1797353)

Utilizator Silviu.Stancioiu@gmail.comSilviu Stancioiu [email protected] Data 4 noiembrie 2016 11:50:44
Problema Perle Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 7.28 kb
#include <stdio.h>

#define MAX_LENGTH 10010

struct Solution
{
    int value = 0;
    int instance = 0;
};

FILE* fin;
FILE* fout;

int n;

int crtLgh;

int nextBuff[MAX_LENGTH] = { 0 };
int nre[MAX_LENGTH] = { 0 };
Solution sol[MAX_LENGTH];

bool isGood = false;

void LoadFiles()
{
    fin = fopen("perle.in", "r");
    fout = fopen("perle.out", "w");
}

void Init()
{
    LoadFiles();
}

void ReadNre()
{
    for(int i=0;i<crtLgh;i++)
    {
        fscanf(fin, "%d", &nre[i]);
    }
}

void Complete(int index, int type)
{
    int instance = sol[index].instance + 1;

    int nextIx = 0;
    int index2 = index+1;

    while(sol[index2].value != 0)
    {
        //printf("DA MA\n");
        nextBuff[nextIx++] = sol[index2++].value;
    }

    int ramIndex;

    switch(type)
    {
    case 0:
        sol[index].value = 1;
        sol[index].instance = instance;
        ramIndex = index+1;
        break;
    case 1:
        sol[index].value = 2;
        sol[index].instance = instance;
        ramIndex = index+1;
        break;
    case 2:
        sol[index].value = 3;
        sol[index].instance = instance;
        ramIndex = index+1;
        break;
    case 3:
        sol[index].value = 2;
        sol[index].instance = instance;

        sol[index+1].value = 'B';
        sol[index+1].instance = instance;

        ramIndex = index+2;
        break;
    case 4:
        sol[index].value = 1;
        sol[index].instance = instance;

        sol[index+1].value = 'A';
        sol[index+1].instance = instance;

        sol[index+2].value = 3;
        sol[index+2].instance = instance;

        sol[index+3].value = 'A';
        sol[index+3].instance = instance;

        sol[index+4].value = 'C';
        sol[index+4].instance = instance;
        ramIndex = index+5;
        break;
    case 5:
        sol[index].value = 2;
        sol[index].instance = instance;
        ramIndex = index+1;
        break;
    case 6:
        sol[index].value = 3;
        sol[index].instance = instance;

        sol[index+1].value = 'B';
        sol[index+1].instance = instance;

        sol[index+2].value = 'C';
        sol[index+2].instance = instance;
        ramIndex = index + 3;
        break;
    case 7:
        sol[index].value = 1;
        sol[index].instance = instance;

        sol[index+1].value = 2;
        sol[index+1].instance = instance;

        sol[index+2].value = 'A';
        sol[index+2].instance = instance;
        ramIndex = index+3;
        break;
    }

    for(int i=0;i<nextIx;i++)
    {
        sol[ramIndex].value = nextBuff[i];
        sol[ramIndex].instance = instance-1;
        ramIndex++;
    }
}

void Remove(int index, int val)
{
    int instance = sol[index].instance;

    int fIx = index;

    sol[index].value = val;
    sol[index].instance = instance-1;

    index++;

    int backIndex = index;

    while(sol[index].instance >= instance)
    {
        sol[index].value = 0;
        sol[index].instance = 0;
        index++;
    }

    while(sol[index].value != 0)
    {
        if(sol[index].instance < instance)
        {
           // printf("(%d %d (%d val:%d))\n", fIx, backIndex, index, sol[index].value);
            sol[backIndex] = sol[index];
            if(index != backIndex)
            {
                sol[index].instance = 0;
                sol[index].value = 0;
            }
            index++;
            backIndex++;
        }
        else
        {
        }
    }
}

void Process(int index)
{
    if(index <= crtLgh && !isGood)
    {
/*
        for(int i=0;i<=index + 10;i++)
        {
            if(sol[i].value > 3)
            {
                printf("%c ", sol[i].value);
            }
            else
            {
                printf("%d ", sol[i].value);
            }
            //rintf("(%d) ", sol[i].instance);
        }
        printf("(!!!%d)\n",crtLgh);*/
        if(index == 0)
        {
            for(int i=0;i<8;i++)
            {
                Complete(0, i);

                if(sol[index].value == nre[index])
                {
                    Process(index+1);
                }

                Remove(0, 0);
            }
        }
        else
        {
            if(index == crtLgh && sol[index].value == 0)
            {
                //printf("AICIA\n");
                isGood = true;
            }
            else
            {
                    if(index < crtLgh)
                    {
                    if(sol[index].value == nre[index])
                    {
                        Process(index+1);
                    }
                    else
                    {
                        if(sol[index].value == 'A')
                        {
                            Complete(index, nre[index]-1);
                            Process(index);
                            Remove(index, 'A');
                        }
                        else
                        {
                            if(sol[index].value == 'B')
                            {
                                Complete(index, 3);
                                Process(index);
                                Remove(index, 'B');

                                Complete(index, 4);
                                Process(index);
                                Remove(index, 'B');
                            }
                            else
                            {
                                if(sol[index].value == 'C')
                                {
                                    Complete(index, 5);
                                    Process(index);
                                    Remove(index, 'C');
                                //printf("TEST!!!!!!\n");
                                       /* for(int i=0;i<=index + 10;i++)
        {
            if(sol[i].value > 3)
            {
                printf("%c ", sol[i].value);
            }
            else
            {
                printf("%d ", sol[i].value);
            }
            //rintf("(%d) ", sol[i].instance);
        }
        printf("(!!!%d)\n",crtLgh);
*/
                                    Complete(index, 6);
                                    Process(index);
                                    Remove(index, 'C');

                                    Complete(index, 7);
                                    Process(index);
                                    Remove(index, 'C');
                                }
                                else
                                {

                                }
                            }
                        }
                    }
                }
            }
        }
    }
}

void WriteBool(bool val)
{
    fprintf(fout, "%d\n", val);
}

void Read()
{
    fscanf(fin, "%d", &n);

    for(int i=0;i<n;i++)
    {
        fscanf(fin, "%d", &crtLgh);
        ReadNre();
        isGood = false;
        Process(0);
        WriteBool(isGood);
    }
}

void CloseFiles()
{
    fclose(fin);
    fclose(fout);
}

void Terminate()
{
    CloseFiles();
}

int main(void)
{
    Init();
    Read();
    Terminate();

    return 0;
}