# PBinfo #2261 – turn – Rezolvare C++

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

## 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.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.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
1 ≤ culoare ≤ 5
nu există cuburi identice
pentru datele de intrare există întotdeauna soluție

Exemplu:
turn.in

5 5
1 1
2 1
1 2
2 2
3 1
turn.out

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

## Cod sursă C++

```cpp
# include <fstream>
using namespace std;
ifstream f("turn.in");
ofstream g("turn.out");
struct cub{
    int l, c;
}T[101];
int st[20], h[20];
int n, H;
bool ap[101];
void tipar(int k)
{
    for(int i=1; i<=k; ++i)
        g << st[i] << ' ';
    g << '\n';
}
void back(int k)
{
    for(int x=1; x<=n; ++x){
        st[k] = x;
        if (!ap[st[k]]){
            if (h[k-1] + T[st[k]].l <= H){
                if (k == 1 || (T[st[k]].c != T[st[k-1]].c && T[st[k]].l <= T[st[k-1]].l)){
                    ap[st[k]] = 1;
                    h[k] = h[k-1] + T[st[k]].l;
                    if (h[k] == H) tipar(k);
                        else back(k+1);
                    ap[st[k]] = 0;
                }
            }
        }
    }
}
int main()
{
    f >> n >> H;
    for(int i=1; i<=n; ++i){
        f >> T[i].l  >> T[i].c;
    }
    back(1);
    return 0;
}
```

## Resurse

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