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

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

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

Написал программу для перестановки букв в слове и выводе всех возможных перестановок. Но при вводе слова с одинаковыми буквами он выведет одинаковые перестановки.Не подскажете как сделать так чтобы он этого не делал.
#include <stdio.h>
#include <conio.h>
#include <stdlib.h>
#define BOOL    int
#define TRUE    1
#define FALSE   0
#define Len     7
int length;
int* st;                            
char* v;
void Sort(char* mass, int _len)         
{
    int i,j;
    char tmp;
    for(i = 0 ; i < _len ; i++) 
    {                                   
        for(j = 0 ; j < _len - i - 1 ; j++) 
        {  
            if(mass[j] > mass[j+1]) 
            {                           
                tmp = mass[j]; 
                mass[j] = mass[j+1] ; 
                mass[j+1] = tmp; 
            }
        }
    }
}
 
    void Initialize(char* _v,int _length)       
    {
        int i;
        length = _length;
        v = (char*)malloc((length*sizeof(char))+1);
        st = (int*)malloc(length * sizeof(int));
 
        for (i = 0;i<length;i++)
            v[i] = _v[i];
        v[length] = 0;
 
        for (i = 0; i < length; i++)
            st[i] = 0;
    }
 
    void Swap(char* a, char* b)     
    {
        char t = *a;
        *a = *b;
        *b = t;
    }
    void Reverse(char* v, int start)                
    {
        int i;
        for ( i = 0; i < (length - start) / 2; i++)
            Swap(&(v[start + i]), &(v[length - 1 - i]));
    }
    BOOL NextPermutation()      
    {
        int pos,i;
        if (length< 2) return FALSE;
        pos = length - 2;
        while (pos >= 0)
        {
            if (st[pos] < length- 1 - pos)
            {
                Reverse(v, pos + 1);
                for (i = pos + 1; i < length; )
                    st[i++] = 0;
                st[pos]++;
                Swap(&(v[pos]), &(v[pos + st[pos]]));
                return TRUE;
            }
            pos--;
        }
        return FALSE;
    }

int main()
{   
        int k = 0,i;                                    
        char mas[Len+1];
        mas[Len] = 0;                               
        scanf("%s", mas);                           

        for(i = 0;mas[i]!='\0';++i)
        {
            k = i+1;                                
        }
        Sort(mas,k);                                
        Initialize(mas,k);      
                                        
        do
        {
            printf("%s\n ",v);  
 
        }
        
        while( NextPermutation());              
    
        getchar();
        getchar();
        return 0;
}
при вводе caba выдает aabc aacb abac abca acab acba aabc aacb то есть меняет местами 2 буквы а ... а нужно aabc aacb abac abca acab acba baac baca
Уважаемые, может подскажет кто-нибудь, где ошибаюсь....?

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

textual
Листинг программы
#include <stdio.h>
 
size_t _length(char *first)
{
  size_t len = 0;
  while(*first++ != '\0')
    ++len;
 
  return len;
}
 
void _swap(char *a, char *b)
{
  char c = *a;
  *a = *b;
  *b = c;
}
 
void _reverse(char *first, char *last)
{
  size_t len = _length(first);
  --last;
  for(int i = 0; i < len / 2; ++i)
    _swap(first++, last--);
}
 
void _sort(char *first)
{
  size_t len = _length(first);
  for(int i = 0; i < len; ++i)
    for(int j = i; j < len; ++j)
      if(*(first + i) > *(first + j))
        _swap(first + i, first + j);
}
 
int _next_permutation(char *first, char *last)
{
  if (first == last)
      return 0;
  char *i = first;
  ++i;
  if (i == last)
      return 1;
  i = last;
  --i;
 
  for(;;)
    {
    char *ii = i;
      --i;
      if (*i < *ii)
    {
      char *j = last;
      while (!(*i < *--j)){}
          _swap(i, j);
          _reverse(ii, last);
          return 1;
        }
      if (i == first)
    {
      _reverse(first, last);
      return 0;
    }
    }
}
 
int main(){
  char a[] = "321";
  size_t len = _length(a);
  _sort(a);
  do{
    for(int i = 0; i < len; ++i)
      printf("%c ", a[i]);
    printf("\n");
  }while(_next_permutation(a, a + len));
  return 0;
}

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

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

  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
Похожие ответы