С++ перестановка букв - нужно реализовать размещения из 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;
}