Cod sursa(job #1797348)

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

#define MAX_LENGTH 10005

FILE* fin;
FILE* fout;

int crtLgh;
int n;

int nre[MAX_LENGTH] = { 0 };
int mySir[MAX_LENGTH] = { 0 };

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

void Init()
{
    LoadFiles();
}

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

bool ProcessSir()
{
    int ramase = crtLgh;
    bool first = true;
    bool finished = false;

    int crtIndex = 0;

    while(!finished)
    {
        ramase = crtLgh - crtIndex;

        if(ramase == 1 || ramase == 0)
        {
            return true;
        }
        else
        {
            if(first && mySir[crtIndex] == 0)
            {
                if(ramase == 3 && nre[crtIndex] == 1 && nre[crtIndex+1] == 2)
                {
                    return true;
                }
                else
                {
                    if(ramase >= 3 && nre[crtIndex] == 3)
                    {
                        mySir[crtIndex] = 2;
                        mySir[crtIndex + 1] = 'B';
                        mySir[crtIndex + 2] = 'C';
                    }
                    else
                    {
                        if(ramase >= 2 && nre[crtIndex] == 2)
                        {
                            mySir[crtIndex] = 2;
                            mySir[crtIndex+1] = 'B';
                        }
                        else
                        {
                            if(ramase >= 5 && nre[crtIndex] == 1)
                            {
                                mySir[crtIndex] = 1;
                                mySir[crtIndex + 1] = 'A';
                                mySir[crtIndex + 2] = 3;
                                mySir[crtIndex + 3] = 'A';
                                mySir[crtIndex + 4] = 'C';
                            }
                            else
                            {
                                return false;
                            }
                        }
                    }
                }
                first = false;
                crtIndex++;
            }
            else
            {
                if(!first)
                {
                    return false;
                }
            }

            if(mySir[crtIndex] != 0)
            {
                if(mySir[crtIndex] == nre[crtIndex])
                {
                    crtIndex++;
                }
                else
                {
                    if(mySir[crtIndex] == 'A')
                    {
                        crtIndex++;
                    }
                    else
                    {
                        if(mySir[crtIndex] == 'B')
                        {
                            bool hasC = (mySir[crtIndex+1] == 'C');
                            if(nre[crtIndex] == 2)
                            {
                                mySir[crtIndex+1] = 'B';
                                crtIndex++;
                                if(hasC)
                                {
                                    mySir[crtIndex+1] = 'C';
                                }
                            }
                            else
                            {
                                if(nre[crtIndex] == 1)
                                {
                                    mySir[crtIndex+1] = 'A';
                                    mySir[crtIndex+2] = 3;
                                    mySir[crtIndex+3] = 'A';
                                    mySir[crtIndex+4] = 'C';

                                    if(hasC)
                                    {
                                        mySir[crtIndex+5] = 'C';
                                    }

                                    crtIndex++;
                                }
                                else
                                {
                                    printf("DA\n");
                                    return false;
                                }
                            }
                        }
                        else
                        {
                            if(mySir[crtIndex] == 'C')
                            {
                                if(ramase == 1 && nre[crtIndex] == 2)
                                {
                                    return true;
                                }
                                else
                                {
                                    if(nre[crtIndex] == 3)
                                    {
                                        mySir[crtIndex + 1] = 'B';
                                        mySir[crtIndex + 2] = 'C';
                                        crtIndex++;
                                    }
                                    else
                                    {
                                        if(nre[crtIndex] == 1)
                                        {
                                            printf("DA\n");
                                            mySir[crtIndex + 1] = 2;
                                            mySir[crtIndex + 2] = 'A';
                                            crtIndex++;
                                        }
                                        else
                                        {
                                            printf("DA\n");
                                            return false;
                                        }
                                    }
                                }
                            }
                        }
                    }
                }
            }
            else
            {
                printf("DA\n");
                return false;
            }
        }
    }
}

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

    for(int i=0;i<n;i++)
    {
        fscanf(fin, "%d", &crtLgh);
        ReadSir();
        printf("",ProcessSir());
    }
}

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

void Terminate()
{
    CloseFiles();
}

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

    return 0;
}