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
: A
1
, A
2
, …, A
m
cu proprietatea că A=A
1
U A
2
U...U A
m
.
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}
#include <bits/stdc++.h> using namespace std; ifstream cin("partitiimultime.in"); ofstream cout("partitiimultime.out"); int x[10], n; int maxim(int k) { int maxi = 0; for(int i = 1 ; i < k ; i++) maxi = max(x[i] , maxi); return maxi; } void afisare() { int maxi = maxim(n + 1); for(int i = 1 ; i <= maxi ; i++) { for(int j = 1 ; j <= n ; j++) if(x[j] == i) cout << j; cout << "*"; } cout << '\n'; } void back(int k) { for(int i = 1 ; i <= maxim(k)+1 ; i++) { x[k] = i; if(k == n) afisare(); else back(k + 1); } } int main() { cin >> n; x[1] = 1; back(2); return 0; }