Консультация № 196602
07.10.2019, 20:44
0.00 руб.
0 6 2
Здравствуйте! Прошу помощи в следующем вопросе:

Напишите программу, перебирающую все перестановки массива букв в лексикографическом порядке. Программа должна работать не более чем за O(n!*n) шагов.

Заранее спасибо.

Обсуждение

давно
Студент
402651
154
07.10.2019, 21:54
общий
08.10.2019, 11:27
это ответ
Здравствуйте, moonfox!

Код:
#include <algorithm>
#include <string>
#include <iostream>

int main()
{
std::string s = "acb"; // что переставляем
std::sort(s.begin(), s.end());
do
{
std::cout << s << std::endl;
} while(std::next_permutation(s.begin(), s.end()));
}
5
давно
Советник
400484
472
08.10.2019, 10:17
общий
Адресаты:
А что такое O(n!*n)?
давно
Посетитель
7438
7205
08.10.2019, 11:38
общий
08.10.2019, 11:39
Адресаты:
Это временная сложность алгоритма
Т.к. за сколько "шагов" должен быть получен результат, в зависимости от размерности аргумента.
Кстати, приведенная программа вроде как вкладывается в этот критерий.
Об авторе:
"Если вы заметили, что вы на стороне большинства, —
это верный признак того, что пора меняться." Марк Твен
давно
Советник
400484
472
08.10.2019, 12:13
общий
т.е. число шагов для n = 3 число шагов будет 3! * 3 = 18. не больше 18 шагов. я правильно понял?
давно
Посетитель
7438
7205
08.10.2019, 15:40
общий
Адресаты:
Правильно
Об авторе:
"Если вы заметили, что вы на стороне большинства, —
это верный признак того, что пора меняться." Марк Твен
давно
Советник
400484
472
08.10.2019, 15:47
общий
это ответ
Здравствуйте, moonfox!
Вот еще один вариант:
Код:

#include <iostream>
#include <set>
#include <string>
#include <cstring>

using namespace std;

int factorial(int i)
{
if (i == 0) return 1;
else return i*factorial(i - 1);
}

int main()
{
char chars[] = "fdsgcba";

// получаем размер массива
int size = sizeof(chars) / sizeof(chars[0]) - 1; // -1 для отсечения \0 (окончания строки). иначе он будет учитыватся в переборе.

char temp; // временная переменная для обмена элементов местами

int count = 0; // счетчик перебора
// Сортировка массива пузырьком
for (int i = 0; i < size - 1; i++) {
for (int j = 0; j < size - i - 1; j++) {
if (chars[j] > chars[j + 1]) {
// меняем элементы местами
temp = chars[j];
chars[j] = chars[j + 1];
chars[j + 1] = temp;

++count;
}
}
}

// Вывод отсортированного массива на экран
for (int i = 0; i < size; i++) {
cout << chars[i] << " ";
}
cout << endl;

cout << "Count: " << count << endl;
cout << "O(n!*n): " << factorial(size) * size << endl;

return 0;
}

На выходе:
Код:

a b c d f g s
Count: 17
O(n!*n): 35280
Форма ответа