#include <iostream>
#include <vector>
#include <initializer_list>
#include <string>

template <typename T>
auto makeVector(std::initializer_list<T> l) {
    return std::vector<T>(l);
}

int main() {
    const auto dict = makeVector({"[В]", "[ж]", "[у]", "[х]"});
    const size_t dictSize = dict.size();
    const size_t wordSize = 5;
    
    size_t current[wordSize] = {};
    
    auto out = [&] {
        for (size_t i = 0; i < wordSize; ++i) {
            std::cout << dict[current[wordSize - 1 - i]] << ' ';
        }
        
        std::cout << '\n';
    };
    
    auto done = [&] {
        for (size_t i = 0; i < wordSize; ++i) {
            if (current[i] < dictSize - 1) {
                return false;
            }
        }
        
        return true;
    };
    
    auto inc = [&] {
        bool carryFlag = false;

        for (size_t i = 0; i < wordSize; ++i) {
            size_t newValue = current[i] + 1;

            if (newValue >= dictSize) {
                carryFlag = true;

                continue;
            }

            if (carryFlag) {
                for (size_t j = 0; j <= i; j++) {
                    current[j] = newValue;
                }
            } else {
                current[i] = newValue;
            }

            break;
        }
    };
    
    while (true) {
        out();

        if (done()) {
            break;
        }

        inc();
    }
}
