fbpx

Problema #1330 – partitiimultime – Rezolvari PBInfo

de Mihai-Alexandru

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. {1,2,3}
  2. {1,2} U {3}
  3. {1,3} U {2}
  4. {1} U {2,3}
  5. {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;
}
Comentarii

S-ar putea sa iti placa