Stepenasti niz

Napisati program koji ispisuje sve stepenaste nizove dužine \(n\) u leksikografskom poretku. Niz je stepenast ako počinje brojem 1 i svaki naredni element niza je ili jednak prethodnom ili za jedan veći od njega

Opis ulaza

Sa standardnog ulaza se unosi broj \(n\) (\(1 \le n \le 18\)).

Opis izlaza

Na standardni izlaz ispisati sve stepenaste nizove dužine \(n\), svaki u zasebnom redu.

Primer

Ulaz

3

Izlaz

1 1 1 1 1 2 1 2 2 1 2 3

Rešenje

Opis glavnog rešenja

Zadatak rešavamo rekurzivnim nabrajanjem traženih kombinatornih objekata. Tehnika je veoma slična nabrajanju varijacija. Na prvu poziciju postavljamo 1, a na svaku narednu ili element jednak onom na prethodnoj poziciji ili element za jedan veći od njega. Nakon postavljanja elementa rekurzivno nastavljamo popunjavanje niza sve dok ne bude potpuno popunjen, kada ga ispisujemo.

#include <iostream>
#include <vector>

using namespace std;

void ispisi(const vector<int>& v) {
   for(int x : v)
      cout << x << ' ';
      cout << endl;
}

void stepenasti(vector<int>& v, int i) {
   // ceo niz je popunjen, pa ga ispisujemo
   if (i == v.size()) {
      ispisi(v);
      return;
   }

   // niz nije popunjen, pa ga dopunjujemo narednim elementom
   // naredni element je jednak prethodnom
   v[i] = v[i - 1];
   stepenasti(v, i + 1);

   // naredni element je od prethodnog veci za jedan
   v[i] = v[i - 1] + 1;
   stepenasti(v, i + 1);
}

// stampa sve stepenaste nizove duzine n
void stepenasti(int n) {
   vector<int> v(n);
   v[0] = 1;
   stepenasti(v, 1);
}

int main() {
   int n;
   cin >> n;

   stepenasti(n);

   return 0;
}