Вывести все перестановки символов выбранной длины с повторением в CPP - PullRequest
0 голосов
/ 16 января 2020

Этот код просто печатает цифры! Что я должен сделать, чтобы напечатать строку?!

например, я выбираю 5 для длины с AB C, и вывод должен быть:

aaaaa
aaaab
aaaac
aaaba
aaabb
aaabc
aaaca
aaacb
aaacc
aabaa
aabab
aabac
aabba
aabbb
aabbc
aabca
aabcb
aabcc
aacaa
aacab
aacac
aacba
aacbb
aacbc
aacca
aaccb
aaccc
abaaa
abaab
abaac
ababa
ababb
ababc
abaca
abacb
abacc
abbaa
abbab
abbac
abbba
abbbb
abbbc
abbca
abbcb
abbcc
abcaa
abcab
abcac
abcba
abcbb
abcbc
abcca
abccb
abccc
acaaa
acaab
acaac
acaba
acabb
acabc
acaca
acacb
acacc
acbaa
acbab
acbac
acbba
acbbb
acbbc
acbca
acbcb
acbcc
accaa
accab
accac
accba
accbb
accbc
accca
acccb
acccc
baaaa
baaab
baaac
baaba
baabb
baabc
baaca
baacb
baacc
babaa
babab
babac
babba
babbb
babbc
babca
babcb
babcc
bacaa
bacab
bacac
bacba
bacbb
bacbc
bacca
baccb
baccc
bbaaa
bbaab
bbaac
bbaba
bbabb
bbabc
bbaca
bbacb
bbacc
bbbaa
bbbab
bbbac
bbbba
bbbbb
bbbbc
bbbca
bbbcb
bbbcc
bbcaa
bbcab
bbcac
bbcba
bbcbb
bbcbc
bbcca
bbccb
bbccc
bcaaa
bcaab
bcaac
bcaba
bcabb
bcabc
bcaca
bcacb
bcacc
bcbaa
bcbab
bcbac
bcbba
bcbbb
bcbbc
bcbca
bcbcb
bcbcc
bccaa
bccab
bccac
bccba
bccbb
bccbc
bccca
bcccb
bcccc
caaaa
caaab
caaac
caaba
caabb
caabc
caaca
caacb
caacc
cabaa
cabab
cabac
cabba
cabbb
cabbc
cabca
cabcb
cabcc
cacaa
cacab
cacac
cacba
cacbb
cacbc
cacca
caccb
caccc
cbaaa
cbaab
cbaac
cbaba
cbabb
cbabc
cbaca
cbacb
cbacc
cbbaa
cbbab
cbbac
cbbba
cbbbb
cbbbc
cbbca
cbbcb
cbbcc
cbcaa
cbcab
cbcac
cbcba
cbcbb
cbcbc
cbcca
cbccb
cbccc
ccaaa
ccaab
ccaac
ccaba
ccabb
ccabc
ccaca
ccacb
ccacc
ccbaa
ccbab
ccbac
ccbba
ccbbb
ccbbc
ccbca
ccbcb
ccbcc
cccaa
cccab
cccac
cccba
cccbb
cccbc
cccca
ccccb
ccccc

Код:

#include <stdio.h>
#include <list>
#include <string>
#include <iostream>
using namespace std;



int outputDigit;
string input[1000];
int num;
string final;
int z=0;
struct Generator
{
public:
    Generator(int s): cSlots(s)
    {
        a = new int[s];
        for (int i = 0; i < cSlots - 1; i++) {
            a[i] = 1;
        }
        a[cSlots - 1] = 0;
        nextInd = cSlots;
    }
    ~Generator()
    {
        delete a;
    }

    bool doNext()
    {
        for (;;)
        {
            if (a[nextInd - 1] == cValues) {
                nextInd--;
                if (nextInd == 0)
                    return false;
            }
            else {
                a[nextInd - 1]++;
                while (nextInd < cSlots) {
                    nextInd++;
                    a[nextInd - 1] = 1;
                }
                return true;
            }
        }
    }

    void doPrint()
    {
        for (int i = 0; i < cSlots; i++) {
            num=a[i];
            cout<<num;
        }
        printf("\n");
    }

public:
    int *a;
    int cSlots;
    int cValues;
    int nextInd;
};

int main()
{
    cout<<"enter outputDigits";
    cin>>outputDigit;

    Generator g(outputDigit);

    while (g.doNext()) {
        g.doPrint();
    }

    return 0;
}

но на выходе получается

enter outputDigits5
11121
11122
11123
11124
11125
11126
11127
11128
11129
111210
111211
111212
111213
111214
111215
111216
111217
111218
111219
111220
111221
111222
111223
111224
111225
111226
111227
111228
111229
111230
111231
111232
111233
111234
111235......

Ответы [ 3 ]

0 голосов
/ 16 января 2020

Вы можете выполнить простой исчерпывающий поиск.

#include <iostream>
#include <string>

using namespace std;

void enumerate(const string& s, int n, string t = "")
{
    if (n == 0)
        cout << t << endl;
    else
    {
        for (char c : s)
            enumerate(s, n - 1, t + c);
    }
}

int main()
{
    enumerate("abc", 5);
}

Сложность: O(s.size()^n)

0 голосов
/ 16 января 2020

Решение с использованием жесткого кода будет выглядеть следующим образом:

const char choices[] = {'a', 'b', 'c'};
for (int a1 : choices) {
  for (int a2 : choices) {
    for (int a3 : choices) {
      for (int a4 : choices) {
        for (int a5 : choices) {
            do_job(a1, a2, a3, a4, a5);
        }
      }
    }
  }
}

Вы можете использовать следующее для обобщенного c пути (все a с в векторе):

template <typename T>
bool increase(const std::vector<T>& v, std::vector<std::size_t>& it)
{
    for (std::size_t i = 0, size = it.size(); i != size; ++i) {
        const std::size_t index = size - 1 - i;
        ++it[index];
        if (it[index] >= v.size()) {
            it[index] = 0;
        } else {
            return true;
        }
    }
    return false;
}

template <typename T>
void do_job(const std::vector<T>& v, const std::vector<std::size_t>& it)
{
    for (const auto e : it) {
        std::cout << v[e] << " ";
    }
    std::cout << std::endl;
}

template <typename T>
void iterate(const std::vector<T>& v, std::size_t size)
{
    std::vector<std::size_t> it(size, 0);

    do {
        do_job(v, it);
    } while (increase(v, it));
}

Демо

0 голосов
/ 16 января 2020

Что такое cValues?

Я знаю, что этот ответ не даст вам правильного ответа напрямую. Однако я советую вам убедиться, что вы:

• инициализируете все атрибуты в конструкторе.

• избегаете использования глобальных членов.

• используете более описательные имена .

• сначала попытайтесь воспроизвести ошибки с помощью ввода меньшего размера (например, 2 или 3).

С уважением,

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...