# PBinfo #1330 – PartitiiMultime – Rezolvare C++

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

## Enunț

Cerința
Fie n un număr natural nenul și mulțimea A={1,2,3,...,n}. Să se determine toate partițiile disjuncte ale mulțimii A. 

O partiție a mulțimii A este formată din m (1 ≤ m ≤ n) submulțimi disjuncte ale lui A: A1, A2, …, Am cu proprietatea că A=A1U A2 U...U Am.

Date de intrare
Fișierul de intrare partitiimultime.in conține pe prima linie numărul n.

Date de ieșire
Fișierul de ieșire partitiimultime.out va conține câte o linie pentru fiecare partiție determinată. Submulțimile vor fi separate în fiecare linie cu ajutorul caracterului *, iar elementele fiecărei submulțimi se vor scrie fără spațiere, ca în exemplul de mai jos.

Restricții și precizări

1 ≤ n ≤ 9
Partițiile determinate se vor afișa în ordine lexicografică

Exemplu:
partitiimultime.in

3
partitiimultime.out

123*
12*3*
13*2*
1*23*
1*2*3*
Explicație
Sunt determinate 5 partiții distincte ale mulțimii A.


{1,2,3}
{1,2} U {3}
{1,3} U {2}
{1} U {2,3}
{1} U {2} U {3}

## Cod sursă C++

```cpp
//partitiile unei multimi
#include <fstream>
using namespace std;
int x[10], n;
ofstream g("partitiimultime.out");
ifstream f("partitiimultime.in");
int maxim(int k)
{int i,z=0;
    for(i=1;i<k;i++)
    z=max(x[i],z);
    return z;
}
void scrie()
{ int i,z,j;
  z=maxim(n+1);
  for(i=1;i<=z;i++)
    { for(j=1;j<=n;j++)
        if(x[j]==i)g<<j;
    g<<"*";
    }
    g<<endl;}
void back(int k)
{ if(k==n+1)scrie();
  else
   for(int i=1; i<=maxim(k)+1;i++)
     { x[k]=i;
       back(k+1);}
}
int main()
{ f>>n;
  x[1]=1;
  back(2);
return 0;}
```

## Resurse

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