Pessoal estou com um problema em um trabalho da faculdade, preciso programar um programa em C onde dada uma string preciso printar todas as permutações, arranjos e combinações.
Meu problema vem nos arranjos, a permutação consegui porém nos arranjos não consegui pensar numa forma certa de implementar.
Exemplo da saída do programa:
Entrada: BOLA
Saída:
permutações:
1 B O L A
2 B O A L
3 B L O A
4 B L A O
5 B A O L
6 B A L O
7 O B L A
8 O B A L
9 O L B A
10 O L A B
11 O A B L
12 O A L B
13 L B O A
14 L B A O
15 L O B A
16 L O A B
17 L A B O
18 L A O B
19 A B O L
20 A B L O
21 A O B L
22 A O L B
23 A L B O
24 A L O B
Entrada:
elementos para arranjar: 3
Saída:
arranjos(4,3): 24
1 B O L
2 B O A
3 B L O
4 B L A
5 B A O
6 B A L
7 O B L
8 O B A
9 O L B
10 O L A
11 O A B
12 O A L
13 L B O
14 L B A
15 L O B
16 L O A
17 L A B
18 L A O
19 A B O
20 A B L
21 A O B
22 A O L
23 A L B
24 A L O
Meu código para as permutações ficou assim:
//Função comparativa que permite uso do qsort
int compare(const void* a, const void* b)
{
return (*(char*)a - *(char*)b);
}
//Função de Troca de caracters
void troca(char* a, char* b)
{
char t = *a;
*a = *b;
*b = t;
}
int findCeil(char palavra[], char primeiro, int left, int h)
{
int ceilIndex = left;
for (int i = left + 1; i <= h; i++)
if (palavra[i] > primeiro && palavra[i] < palavra[ceilIndex])
ceilIndex = i;
return ceilIndex;
}
//Função que printa as pemutações
void sortedPermutations(char palavra[])
{
int size = strlen(palavra);
qsort(palavra, size, sizeof(palavra[0]), compare);
bool isFinished = false;
while (!isFinished) {
static int x = 1;
printf("%d\t%s\n", x++, palavra);
int i;
for (i = size; i >= 0; --i)
if (palavra[i] < palavra[i + 1])
break;
if (i == -1)
isFinished = true;
else {
int ceilIndex = findCeil(palavra, palavra[i], i + 1, size - 1);
troca(&palavra[i], &palavra[ceilIndex]);
qsort(palavra + i + 1, size - i - 1, sizeof(palavra[0]), compare);
}
}
}
Não sei se o post acabou ficando muito grande para a compreensão, mas resumindo minha dificuldade está em desenvolver uma função para printar os arranjos agora, obrigado desde já!