С++ перестановка букв - нужно реализовать размещения из n елемнтов по m

есть задача:

Алфавит племени состоит из 5 букв: A, B, C, D и E. Сколько четырехбуквенных слов можно образовать, если запрещено иметь в слове букву E, которая записана правее буквы B? Например, допустимы слова EEBD, BDDB, а запрещено BAEC.

Пробовал использовать next_permutation(), но она переставляет все 5 букв и каждая перестановка уникальна, т.е не будет AAAA или CCAA. Как можно настроить функцию под себя?


Ответы (1 шт):

Автор решения: Harry

Ну, если вы хотите именно перечислить их все, то просто воспользуйтесь четырехзначными числами с цифрами ABCDE (https://ideone.com/wKoRDN):

#include <vector>
#include <iostream>

using namespace std;

bool check(const vector<char>& s)
{
    int e = -1, b = -1;
    for(int i = 0; i < 4; ++i)
    {
        if (s[i] == 'E' && e < 0) e = i;
        if (s[i] == 'B') b = i;
    }
    if (b>= 0 && e >= 0 && b > e) return false;
    return true;
}

int main(int argc, char * argv[])
{
    vector<char> s = {'A','A','A','A'};
    int total = 0, ok = 0;
    for(;;)
    {
        total++;
        if (check(s)) ok++;

        cout << s[3] << s[2] << s[1] << s[0]
            << (!check(s) ? " !!!!\n" : "\n");

        for(int carry = 1, i = 0; carry && i < 4; ++i)
        {
            s[i] += carry;
            if (s[i] > 'E') { s[i] = 'A'; carry = 1; } else carry = 0;
        }
        if (s == vector<char>(4,'A')) break;
    };
    cout << "Total: " << total << ", right: " << ok << endl;
}
→ Ссылка