Перестановка букв в слове и вывод всех возможных перестановок - C (СИ)

Узнай цену своей работы

Формулировка задачи:

Написал программу для перестановки букв в слове и выводе всех возможных перестановок. Но при вводе слова с одинаковыми буквами он выведет одинаковые перестановки.Не подскажете как сделать так чтобы он этого не делал.
Листинг программы
  1. #include <stdio.h>
  2. #include <conio.h>
  3. #include <stdlib.h>
  4. #define BOOL int
  5. #define TRUE 1
  6. #define FALSE 0
  7. #define Len 7
  8. int length;
  9. int* st;
  10. char* v;
  11. void Sort(char* mass, int _len)
  12. {
  13. int i,j;
  14. char tmp;
  15. for(i = 0 ; i < _len ; i++)
  16. {
  17. for(j = 0 ; j < _len - i - 1 ; j++)
  18. {
  19. if(mass[j] > mass[j+1])
  20. {
  21. tmp = mass[j];
  22. mass[j] = mass[j+1] ;
  23. mass[j+1] = tmp;
  24. }
  25. }
  26. }
  27. }
  28. void Initialize(char* _v,int _length)
  29. {
  30. int i;
  31. length = _length;
  32. v = (char*)malloc((length*sizeof(char))+1);
  33. st = (int*)malloc(length * sizeof(int));
  34. for (i = 0;i<length;i++)
  35. v[i] = _v[i];
  36. v[length] = 0;
  37. for (i = 0; i < length; i++)
  38. st[i] = 0;
  39. }
  40. void Swap(char* a, char* b)
  41. {
  42. char t = *a;
  43. *a = *b;
  44. *b = t;
  45. }
  46. void Reverse(char* v, int start)
  47. {
  48. int i;
  49. for ( i = 0; i < (length - start) / 2; i++)
  50. Swap(&(v[start + i]), &(v[length - 1 - i]));
  51. }
  52. BOOL NextPermutation()
  53. {
  54. int pos,i;
  55. if (length< 2) return FALSE;
  56. pos = length - 2;
  57. while (pos >= 0)
  58. {
  59. if (st[pos] < length- 1 - pos)
  60. {
  61. Reverse(v, pos + 1);
  62. for (i = pos + 1; i < length; )
  63. st[i++] = 0;
  64. st[pos]++;
  65. Swap(&(v[pos]), &(v[pos + st[pos]]));
  66. return TRUE;
  67. }
  68. pos--;
  69. }
  70. return FALSE;
  71. }
  72.  
  73. int main()
  74. {
  75. int k = 0,i;
  76. char mas[Len+1];
  77. mas[Len] = 0;
  78. scanf("%s", mas);
  79.  
  80. for(i = 0;mas[i]!='\0';++i)
  81. {
  82. k = i+1;
  83. }
  84. Sort(mas,k);
  85. Initialize(mas,k);
  86. do
  87. {
  88. printf("%s\n ",v);
  89. }
  90. while( NextPermutation());
  91. getchar();
  92. getchar();
  93. return 0;
  94. }
при вводе caba выдает aabc aacb abac abca acab acba aabc aacb то есть меняет местами 2 буквы а ... а нужно aabc aacb abac abca acab acba baac baca
Уважаемые, может подскажет кто-нибудь, где ошибаюсь....?

Решение задачи: «Перестановка букв в слове и вывод всех возможных перестановок»

textual
Листинг программы
  1. #include <stdio.h>
  2.  
  3. size_t _length(char *first)
  4. {
  5.   size_t len = 0;
  6.   while(*first++ != '\0')
  7.     ++len;
  8.  
  9.   return len;
  10. }
  11.  
  12. void _swap(char *a, char *b)
  13. {
  14.   char c = *a;
  15.   *a = *b;
  16.   *b = c;
  17. }
  18.  
  19. void _reverse(char *first, char *last)
  20. {
  21.   size_t len = _length(first);
  22.   --last;
  23.   for(int i = 0; i < len / 2; ++i)
  24.     _swap(first++, last--);
  25. }
  26.  
  27. void _sort(char *first)
  28. {
  29.   size_t len = _length(first);
  30.   for(int i = 0; i < len; ++i)
  31.     for(int j = i; j < len; ++j)
  32.       if(*(first + i) > *(first + j))
  33.         _swap(first + i, first + j);
  34. }
  35.  
  36. int _next_permutation(char *first, char *last)
  37. {
  38.   if (first == last)
  39.       return 0;
  40.   char *i = first;
  41.   ++i;
  42.   if (i == last)
  43.       return 1;
  44.   i = last;
  45.   --i;
  46.  
  47.   for(;;)
  48.     {
  49.     char *ii = i;
  50.       --i;
  51.       if (*i < *ii)
  52.     {
  53.       char *j = last;
  54.       while (!(*i < *--j)){}
  55.           _swap(i, j);
  56.           _reverse(ii, last);
  57.           return 1;
  58.         }
  59.       if (i == first)
  60.     {
  61.       _reverse(first, last);
  62.       return 0;
  63.     }
  64.     }
  65. }
  66.  
  67. int main(){
  68.   char a[] = "321";
  69.   size_t len = _length(a);
  70.   _sort(a);
  71.   do{
  72.     for(int i = 0; i < len; ++i)
  73.       printf("%c ", a[i]);
  74.     printf("\n");
  75.   }while(_next_permutation(a, a + len));
  76.   return 0;
  77. }

Объяснение кода листинга программы

В данном коде реализованы функции для перестановки букв в слове и вывода всех возможных перестановок.

  1. Функция _length() принимает указатель на первый символ строки и возвращает количество символов в строке.
  2. Функция _swap() меняет местами два символа в строке.
  3. Функция _reverse() меняет порядок символов в строке.
  4. Функция _sort() сортирует символы в строке по возрастанию.
  5. Функция _next_permutation() генерирует следующую перестановку в строке.
  6. В функции main() создаётся массив символов 321, вычисляется его длина, сортируется, генерируются и выводятся все возможные перестановки. Список функций и переменных:
  7. _length(char *first) - функция для вычисления длины строки
  8. _swap(char a, char b) - функция для обмена символами в строке
  9. _reverse(char first, char last) - функция для перестановки порядка символов в строке
  10. _sort(char *first) - функция для сортировки символов в строке
  11. _next_permutation(char first, char last) - функция для генерации следующей перестановки в строке
  12. main() - основная функция программы
  13. a[] - массив символов для перестановки
  14. len - переменная для хранения длины массива a[] Вывод программы: 312 231 132 123

ИИ поможет Вам:


  • решить любую задачу по программированию
  • объяснить код
  • расставить комментарии в коде
  • и т.д
Попробуйте бесплатно

Оцени полезность:

7   голосов , оценка 4.143 из 5

Нужна аналогичная работа?

Оформи быстрый заказ и узнай стоимость

Бесплатно
Оформите заказ и авторы начнут откликаться уже через 10 минут
Похожие ответы