# PBinfo #3944 – turn_1 – Rezolvare C++

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

## Enunț

Se consideră n cuburi numerotate de la 1 la n pentru care se cunosc latura și culoarea. Să se genereze toate turnurile de înălțime H ce se pot forma cu cele n cuburi, astfel încât fiecare turn să respecte următoarele condiții: 

orice cub se așează peste un altul ce are latura mai mare sau egală cu a lui;
să nu existe două cuburi consecutive de aceeași culoare;

Date de intrare
Fișierul de intrare turn_1.in conține pe prima linie două numere naturale n și H, iar pe următoarele n linii descrierea cuburilor. Linia i+1 conține descrierea cubului i sub forma: latură culoare. 

Date de ieșire
Fișierul de ieșire turn_1.out va conține soluțiile generate în ordinea lexicografică a indicilor. O soluție este validă dacă conține descrierea indicilor cuburilor care alcătuiesc turnul de înălțime H.

Restricții și precizări

1 ≤ n < 15
1 ≤ H ≤ 50
1 ≤ latura ≤ 10
culorile sunt șiruri de caractere cu cel mult 20 de litere și sunt scrise cu litere mici
nu există cuburi identice
pentru datele de intrare există întotdeauna soluție

Exemplu:
turn_1.in

5 5
1 alb
2 alb
1 roz
2 roz
3 alb
turn_1.out

2 4 1 
4 2 3 
5 3 1 
5 4 
Explicație
Primul turn este format din cuburile: 2 (2,alb), 4 (2,roz), 1 (1,alb).
Al doilea turn este format din cuburile: 4 (2,roz), 2 (2,alb), 3 (1,roz) 
etc.

## Cod sursă C++

```cpp
#include <fstream>
#include <cstring>
using namespace std;
ifstream fin("turn_1.in");
ofstream fout("turn_1.out");
struct cub { int l; char c[22];};
int H,n,X[20],P[20];
cub A[20];
void afisare(int k)
{
    for(int i=1;i<=k;i++)
        fout<<X[i]<<" ";
    fout<<"\n";
}
void back(int k, int s)
{
    for(int i=1;i<=n;i++)
        if(!P[i])
        {
            X[k]=i;
            P[i]=1;
            s=s+A[X[k]].l;
            if(k==1 || (strcmp(A[X[k]].c,A[X[k-1]].c)!=0 && A[X[k]].l<=A[X[k-1]].l && s<=H))
            {
                if(s==H) afisare(k);
                else back(k+1,s);
            }
            s=s-A[X[k]].l;
            P[i]=0;
        }
}
int main()
{
    fin>>n>>H;
    for(int i=1;i<=n;i++)
        fin>>A[i].l>>A[i].c;
    back(1,0);
    return 0;
}
```

## Resurse

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