Форум программистов, компьютерный форум, киберфорум
С++ для начинающих
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
 
Рейтинг 4.84/146: Рейтинг темы: голосов - 146, средняя оценка - 4.84
Полярный
 Аватар для dimcoder
477 / 449 / 158
Регистрация: 11.09.2011
Сообщений: 1,156

Все возможные перестановки букв слова - нужен алгоритм

03.12.2011, 11:51. Показов 27858. Ответов 22
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Доброго времени суток, форумчане. Помогите пожалуйста найти/составить алгоритм решения следующей задачи:
Дано слово. Найти все возможные варианты перестановки его букв.

Пример:
Дано:
abc
Вывести:
acb
abc
bac
bca
cba
cab

PS Встречал я кое-где решение с next_permutation, но мне важно решить без всяких левых функций.
PSS Ну и программу по ходу дела смастерить тоже нужно
0
Лучшие ответы (1)
Programming
Эксперт
39485 / 9562 / 3019
Регистрация: 12.04.2006
Сообщений: 41,671
Блог
03.12.2011, 11:51
Ответы с готовыми решениями:

Найти все возможные варианты написания слова в верхнем и нижнем регистрах букв.
Хотелось бы увидеть кусочек кода, который выполнял бы следующее: Есть слово "Напримерэто". Как мне вывести на экран (в файл, принтер -...

Вывести все возможные перестановки слов в предложении
С клавиатуры пишем предложение. Вывести все возможные перестановки тех слов в этом предложении, что не содержат первых десяти букв...

Все возможные перестановки элементов заданного массива
Помогите вывести на консоль все возможные перестановки элементов заданного массива void printPermutations (int items , int itemsLength) {...

22
Эксперт С++
 Аватар для Thinker
4267 / 2241 / 203
Регистрация: 26.08.2011
Сообщений: 3,802
Записей в блоге: 5
03.12.2011, 11:53
А буквы в слове могут повторяться?
0
50 / 50 / 12
Регистрация: 22.05.2011
Сообщений: 326
03.12.2011, 11:53
Для начала сортируете все буквы в слове, а потом с помощью рекурсии выводите

(это алгоритм, как и просили)
0
Полярный
 Аватар для dimcoder
477 / 449 / 158
Регистрация: 11.09.2011
Сообщений: 1,156
03.12.2011, 12:00  [ТС]
Цитата Сообщение от Thinker Посмотреть сообщение
А буквы в слове могут повторяться?
Да, могут.

Цитата Сообщение от AncinetHero Посмотреть сообщение
потом с помощью рекурсии выводите
А с этого момента, поподробнее, пожалуйста.

Цитата Сообщение от AncinetHero Посмотреть сообщение
(это алгоритм, как и просили)
Ща исправим
0
50 / 50 / 12
Регистрация: 22.05.2011
Сообщений: 326
03.12.2011, 12:26
Опять алгоритм:
У вас есть функция, которая находит все перестановки и сразу выводит.
Сначала вы ей даете массив char'ов и переменную (допустим b, которая показывает сколько символов с конца мы рассматриваем). И в этой функции полно обращений к такому же массиву и уменьшенной переменной и к массиву, где мы меняем переменные...обьяснить сложно, нужно писать.
Может вы идею уловите по моему краткому комментарию (хотя, скорее всего, мой алгоритм не самый простой)
1
Полярный
 Аватар для dimcoder
477 / 449 / 158
Регистрация: 11.09.2011
Сообщений: 1,156
03.12.2011, 12:36  [ТС]
Цитата Сообщение от AncinetHero Посмотреть сообщение
нужно писать.
Был бы очень благодарен...
0
go
Эксперт С++
3646 / 1378 / 243
Регистрация: 16.04.2009
Сообщений: 4,526
03.12.2011, 13:48
Лучший ответ Сообщение было отмечено как решение

Решение

C
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
/* Vuvesti vse perestanovki*/
#include <stdio.h>
#include <conio.h>
 
 
int str_len (char *s)
{ int i;
    for (i=0; s[i]; i++)
             ;
  return i;
}
void sort_bubl (char *s, int N)     // sortirovka puzirkom
{
    int i,j;
    char buf;
 
    for ( i=0;i<N;i++)              // cikl sortirovki
     for ( j=N-1;j>i;j--)
     if (s[j]<s[j-1])
     {
         buf=s[j]; //zamena
         s[j]=s[j-1];
         s[j-1]=buf;
     }
 
}
 
int main ()
{ char s[6], buf;
  int i,j,N,k,q;  
  clrscr ();
  puts ("Vuvesti vse perestanovki\nVvedite stroku s: ");
  fflush (stdin); scanf ("%s", &s);
  N=str_len(s);
  printf ("\nDlina stroki N=%d", N);
  puts ("\nVse vozmozhnuye perestenovki: ");
 
  sort_bubl (s, N);
 
  while (1) {   // nachinaem perebirat' vse vozmozhnuye perestanovki
   printf("%s\n", s);  // vuvod ocherednoy perestanovki
 
    for (i = N-2; i >= 0  && s[i] >= s[i+1] ; i--);  // nahodim samoe pravoe mesto, gde s[i] < s[i+1]
      if (i<0) break; // uze poluchili vse perestanovki
    for(j=N-1; s[i] >= s[j]; j--) ; // nahodim s[j] - naimenshuy element spravo ot s[i] i bolshe ego
        // menyaem s[i] -  s[j]
    buf = s[j];
   s[j] = s[i];
   s[i] = buf;
 
   // obraschaem el-ntu spravo ot s[i]
   for ( k=i+1, q=N-1; k < q; k++ , q-- )
     {   buf=s[k];
         s[k]=s[q];
         s[q]=buf;
     }
 
  }
 
 
  fflush (stdin); 
  getch ();
  return 0;
}
Писал для Борланда
6
50 / 50 / 12
Регистрация: 22.05.2011
Сообщений: 326
03.12.2011, 17:20
У меня возникает вопрос, похожий на вопрос ТС. Как можно реализовать алгоритм, чтобы он находил все возможные перестановки ЛЮБОЙ длины?
0
go
Эксперт С++
3646 / 1378 / 243
Регистрация: 16.04.2009
Сообщений: 4,526
03.12.2011, 17:25
Цитата Сообщение от AncinetHero Посмотреть сообщение
У меня возникает вопрос, похожий на вопрос ТС. Как можно реализовать алгоритм, чтобы он находил все возможные перестановки ЛЮБОЙ длины?
А у меня какой длины

Добавлено через 2 минуты
Thinker, а какая разница, нужно учесть все
0
50 / 50 / 12
Регистрация: 22.05.2011
Сообщений: 326
03.12.2011, 17:26
Я имел в виду всех длин от 1 до длины строки
То есть для 'abc' будет
a
b
c
ab
ac
ba
bc
ca
cb
abc
0
go
Эксперт С++
3646 / 1378 / 243
Регистрация: 16.04.2009
Сообщений: 4,526
03.12.2011, 17:31
AncinetHero, выделяете из моего кода функцию перестановок, а потом отправляете
C
1
2
3
4
5
6
for (int i=1, char *ss =NULL; i<=strlen(s);i++)
{ 
         ss=strdum (s);
         ss[i]='\0';
         perest (ss);
}
0
Higher
 Аватар для diagon
1953 / 1219 / 120
Регистрация: 02.05.2010
Сообщений: 2,925
Записей в блоге: 2
03.12.2011, 17:32
Цитата Сообщение от AncinetHero Посмотреть сообщение
Как можно реализовать алгоритм, чтобы он находил все возможные перестановки ЛЮБОЙ длины?
Это невозможно, т.к. всего различных перестановок будет n!, где n - длина строки.
Т.е. для строки в 10 символов будет уже 3628800 различных вариантов. А это довольно много.
Точнее правильный алгоритм будет работать для строки любой длины, но для строки длиной ~20 символов дождаться результата будет крайне сложно + переполнится стэк из-за рекурсии.
0
Эксперт С++
 Аватар для Nameless One
5828 / 3479 / 358
Регистрация: 08.02.2010
Сообщений: 7,448
03.12.2011, 17:33
AncinetHero, это уже получается вывести все сочетания по всем наборам элементов
0
go
Эксперт С++
3646 / 1378 / 243
Регистрация: 16.04.2009
Сообщений: 4,526
03.12.2011, 17:33
Цитата Сообщение от diagon Посмотреть сообщение
Это невозможно, т.к. всего различных перестановок будет n!, где n - длина строки.
ну ему может все 3-4 надо
0
Эксперт С++
 Аватар для Nameless One
5828 / 3479 / 358
Регистрация: 08.02.2010
Сообщений: 7,448
03.12.2011, 17:51
Цитата Сообщение от Nameless One Посмотреть сообщение
AncinetHero, это уже получается вывести все сочетания по всем наборам элементов
вот без учета порядка элементов:
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
#include <iostream>
#include <vector>
#include <string>
#include <algorithm>
 
bool next_combination (std::vector<size_t>& a, size_t k)
{
    int n = (int) a.size();
    for (int i=k-1; i>=0; --i)
    {
    if (a[i] < (int) (n-k+i))
    {
        ++a[i];
        for (int j = i + 1; j < (int)k; ++j)
        a[j] = a[j-1] + 1;
        return true;
    }
    }
    
    return false;
}
 
void dump(const std::string& str, const std::vector<size_t>& indices, size_t k)
{
    for(size_t i = 0; i < k; ++i)
    putchar(str[indices[i]]);
    putchar('\n');
}
 
class nat
{
public:
    nat();
    size_t operator () ();
 
private:
    size_t curr;
};
 
nat::nat()
    : curr(0)
{
}
 
size_t nat::operator () ()
{
    return curr++;
}
 
int main()
{
    std::string str = "abc";
 
    size_t size = str.size();
 
    for(size_t i = 1; i <= size; ++i)
    {
    std::vector<size_t> indices(size);
    std::generate(indices.begin(), indices.end(), nat());
 
    do
    {
        dump(str, indices, i);
    }
    while(next_combination(indices, i));
    }
                
    return 0;
}
1
Эксперт С++
 Аватар для Thinker
4267 / 2241 / 203
Регистрация: 26.08.2011
Сообщений: 3,802
Записей в блоге: 5
03.12.2011, 18:01
Цитата Сообщение от go Посмотреть сообщение
Thinker, а какая разница, нужно учесть все
Если нет повторяющихся элементов, то обычные перестановки легче реализовать. Если строка s="aaa"
ваша программа что выведен на экран?

Цитата Сообщение от diagon Посмотреть сообщение
всего различных перестановок будет n!
Немного поправлю. Если в слове k букв и буква a1 повторяется n1 раз,... ak повторяется nk раз, то перестановок всего
https://www.cyberforum.ru/cgi-bin/latex.cgi?\frac{n!}{n_1!...n_k!}
0
go
Эксперт С++
3646 / 1378 / 243
Регистрация: 16.04.2009
Сообщений: 4,526
03.12.2011, 18:03
Thinker, то, что и должна
Code
1
aaa
Миниатюры
Все возможные перестановки букв слова - нужен алгоритм  
2
Полярный
 Аватар для dimcoder
477 / 449 / 158
Регистрация: 11.09.2011
Сообщений: 1,156
03.12.2011, 20:17  [ТС]
Спасибо всем. Буду пока вникать в код:
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
while (1) 
{ 
   // nachinaem perebirat' vse vozmozhnuye perestanovki
   printf("%s\n", s); 
   // vuvod ocherednoy perestanovki
   for (i = N-2; i >= 0 *&& s[i] >= s[i+1] ; i--); 
   // nahodim samoe pravoe mesto, gde s[i] < s[i+1]
   if (i<0) 
       break; // uze poluchili vse perestanovki
   for(j=N-1; s[i] >= s[j]; j--) ;  
   // nahodim s[j] - naimenshuy element spravo ot s[i] i bolshe ego
   // menyaem s[i] - *s[j]
   buf = s[j];
   s[j] = s[i];
   s[i] = buf;
// obraschaem el-ntu spravo ot s[i]
   for ( k=i+1, q=N-1; k < q; k++ , q-- )
   {
       buf=s[k];
       s[k]=s[q];
       s[q]=buf;
   }
}
Вроде всё понятно, надо запомнить. Кстати, go, вы сами алгоритм придумали? Интересно просто.
0
go
Эксперт С++
3646 / 1378 / 243
Регистрация: 16.04.2009
Сообщений: 4,526
03.12.2011, 20:25
dimcoder, алгоритм нет, код сам писал
1
Полярный
 Аватар для dimcoder
477 / 449 / 158
Регистрация: 11.09.2011
Сообщений: 1,156
03.12.2011, 20:28  [ТС]
Спрашиваю потому-что сам долго думал над алгоритмом, результат я задал на форуме

Цитата Сообщение от go Посмотреть сообщение
dimcoder, алгоритм нет, код сам писал
Гуууугл?

PS ещё раз спасибо
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
inter-admin
Эксперт
29715 / 6470 / 2152
Регистрация: 06.03.2009
Сообщений: 28,500
Блог
03.12.2011, 20:28
Помогаю со студенческими работами здесь

Все возможные варианты перестановки символов строки
Дана строка s, состоящая из n символ (n меньше 6) составить все возможные варианты перестановки этих символов (язык C)

Рекурсивная функция: все возможные перестановки символов строки
Дана строка с n элементами. Например abs. Надо выводить все возможные варианты например abs asb bas bsa sab sba. Надо...

Вывести на экран все возможные перестановки введенных ползователем символов
С клавиатуры задается последовательность символов. Написать программу, которая выводит на экран все возможные перестановки введенных...

Вывести на экран все возможные перестановки введенных символов. Где ошибка?
С клавиатуры задается последовательность символов. Написать программу, которая выводит на экран все возможные перестановки введенных...

Ввести число. Используя рекурсивную функцию, получить все возможные перестановки цифр этого числа
Помогите пожалоста..........Заранеє спасибо


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
20
Ответ Создать тему
Новые блоги и статьи
Символьное дифференцирование
igorrr37 13.02.2026
/ * Программа принимает математическое выражение в виде строки и выдаёт его производную в виде строки и вычисляет значение производной при заданном х Логарифм записывается как: (x-2)log(x^2+2) -. . .
Камера Toupcam IUA500KMA
Eddy_Em 12.02.2026
Т. к. у всяких "хикроботов" слишком уж мелкий пиксель, для подсмотра в ESPriF они вообще плохо годятся: уже 14 величину можно рассмотреть еле-еле лишь на экспозициях под 3 секунды (а то и больше),. . .
И ясному Солнцу
zbw 12.02.2026
И ясному Солнцу, и светлой Луне. В мире покоя нет и люди не могут жить в тишине. А жить им немного лет.
«Знание-Сила»
zbw 12.02.2026
«Знание-Сила» «Время-Деньги» «Деньги -Пуля»
SDL3 для Web (WebAssembly): Подключение Box2D v3, физика и отрисовка коллайдеров
8Observer8 12.02.2026
Содержание блога Box2D - это библиотека для 2D физики для анимаций и игр. С её помощью можно определять были ли коллизии между конкретными объектами и вызывать обработчики событий столкновения. . . .
SDL3 для Web (WebAssembly): Загрузка PNG с прозрачным фоном с помощью SDL_LoadPNG (без SDL3_image)
8Observer8 11.02.2026
Содержание блога Библиотека SDL3 содержит встроенные инструменты для базовой работы с изображениями - без использования библиотеки SDL3_image. Пошагово создадим проект для загрузки изображения. . .
SDL3 для Web (WebAssembly): Загрузка PNG с прозрачным фоном с помощью SDL3_image
8Observer8 10.02.2026
Содержание блога Библиотека SDL3_image содержит инструменты для расширенной работы с изображениями. Пошагово создадим проект для загрузки изображения формата PNG с альфа-каналом (с прозрачным. . .
Установка Qt-версии Lazarus IDE в Debian Trixie Xfce
volvo 10.02.2026
В общем, достали меня глюки IDE Лазаруса, собранной с использованием набора виджетов Gtk2 (конкретно: если набирать текст в редакторе и вызвать подсказку через Ctrl+Space, то после закрытия окошка. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru