Cod sursa(job #1828516)

Utilizator AndreidgDragomir Andrei Valentin Andreidg Data 13 decembrie 2016 14:44:46
Problema Perle Scor 10
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.66 kb
#include <fstream>
using namespace std;
const int L=10003;
ifstream f("perle.in");
ofstream g("perle.out");
int v[L],n,l;
int b[L];
bool sol=0;
void replB(int lung);
void check()
{
    for(int i=1;i<=l;i++)
    {
        if(b[i]!=v[i])
        {
            return ;
        }
    }
    sol=1;
}
void replA(int lung)
{
    if(lung>l||sol==1)
    {
        return;
    }
    b[lung]=v[lung];
    if(lung==l)
    {
        check();
    }
}
void replC(int lung)
{
    b[lung]=2;
    if(lung==l)
    {
        check();
        if(sol==1)
        {
            return;
        }
    }
    if(lung+2<=l)
    {
        b[lung]=3;
        replB(lung+1);
        replC(lung+2);
        if(sol==1)
        {
            return ;
        }
        b[lung]=1;
        b[lung+1]=2;
        replA(lung+2);
        if(sol==1)
        {
            return ;
        }
    }
}
void replB(int lung)
{
    if(sol==1)
    {
        return;
    }
    if(lung+1<=l)
    {
        if(v[lung]==2)
        {
            b[lung]=2;
            replB(lung+1);
        }
    }
    if(sol==1)
    {
        return;
    }
    if(lung+4<=l)
    {
        if(v[lung]==1&&v[lung+2]==3)
        {
            b[lung]=1;
            b[lung+2]=3;
            replA(lung+1);
            replA(lung+3);
            replC(lung+4);
        }
    }
}
int main()
{
    f>>n;
    for(int i=1;i<=n;i++)
    {
        f>>l;
        sol=0;
        for(int j=1;j<=l;j++)
        {
            f>>v[j];
        }
        replA(1);
        replB(1);
        replC(1);
        g<<sol<<"\n";
    }
    f.close();
    g.close();
    return 0;
}