# PBinfo #4494 – CIP – Rezolvare C++

Sursa: Codul lui Andrei
Limbaj: C++
Autor rezolvare: Darius

## Enunț

Cerința
Într-o curte sunt a câini, b iepuri și c pisici. Să se genereze în ordine lexicografică șirurile formate cu toate animalele, care:


încep cu câine și se termină cu pisică;
nu conțin niciun iepure între doi câini.

Date de intrare
Programul citește de la tastatură numerele a b c.

Date de ieșire
Programul va afișa pe rânduri separate ale ecranului șiruri formate din a caractere 'C' (câine), b caractere de caractere 'I' (iepure) și c caractere 'P' (pisică), conform enunțului. 

Restricții și precizări

1 ≤ a, b, c ≤ 5

Exemplu:
Intrare

 3 2 2 
Ieșire

CCCIIPP
CCCIPIP
CCCPIIP
CCIICPP
CCIIPCP
CCIPCIP
CCIPICP
CCPCIIP
CCPICIP
CCPIICP
CIICCPP
CIICPCP
CIIPCCP
CIPCCIP
CIPICCP
CPCCIIP
CPCIICP
CPICCIP
CPIICCP

## Cod sursă C++

```cpp
#include <iostream>
using namespace std;
int a,b,c,n,X[16];
void afisare()
{
    char s[]=" CIP";
    for(int i=1;i<=n;i++)
        cout<<s[X[i]];
    cout<<"\n";
}
int valid(int k)
{
    if(X[1]!=1) return 0;
    if(k==n && X[k]!=3) return 0;
    if(k>=3 && X[k-2]==1 && X[k-1]==2 && X[k]==1) return 0;
    int ci=0,cp=0,cc=0;
    for(int i=1;i<=k;i++)
        if(X[i]==1) cc++;
        else if(X[i]==2) ci++;
            else cp++;
    if(cc>a || ci>b || cp>c) return 0;
    return 1;
}
void back(int k)
{
    for(int i=1;i<=3;i++)
    {
        X[k]=i;
        if(valid(k))
            if(k==n) afisare();
            else back(k+1);
    }
}
int main()
{
    cin>>a>>b>>c;
    n=a+b+c;
    back(1);
    return 0;
}
```

## Resurse

- [Pagina originală](https://codulluiandrei.ro/rezolvari/pbinfo/4494)
- [Sursa C++](https://codulluiandrei.ro/rezolvari/pbinfo/4494/cod.cpp)
- [Sursa pe GitHub](https://raw.githubusercontent.com/codulluiandrei/pbinfo/main/pbinfo-4494/main.cpp)
- [Cursuri de informatică pentru BAC](https://codulluiandrei.ro/academia/info-curs/pachet-cpp/)
