Anagrammi

/*[Anagrammi]. Scrivere un funzione ricorsiva
che presa in input una stringa (ordinata lessicograficamente) stampi tutti i suoi
2
anagrammi (permutazioni di caratteri) ordinati in maniera lessicografica.
Se ad esempio abbiamo in input la stringa abcd avremo in output le stringhe:
abcd
abdc
acbd
acdb
adbc
adcb
bacd
badc
bcad
bcda
bdac
bdca
cabd
cadb
cbad
cbda
cdab
cdba
dabc
dacb
dbac
dbca
dcab
dcba
*/

#include
#include
#include

#define MAX 255 /* massima lunghezza di una parola */

void anagr(char *pref, char *string);
void anagrammi(char *string);
void elimina(char *string, char *temp, int k);
void attacca(char *string, char *temp, char c);

int main(){
char string[MAX];
scanf("%s", string);
printf("\n");
anagrammi(string);
return 0;
}


/* Stampa tutte le parole ottenute concatenando la parola contenuta in
prefisso con gli anagrammi della parola contenuta in word. */

void anagr(char *pref, char *string){
int stringl,k;
char newstring[MAX];
char newpref[MAX];
char c;

int us['z'-'a'+1]={0};

stringl = strlen(string);
if (stringl == 0)
printf("%s\n", pref);
else{
for(k=0 ; k c = string[k];
if(us[c-'a'] == 0){
us[c-'a'] = 1;
attacca(newpref, pref, c);
elimina(newstring, string, k);
anagr(newpref, newstring);
}
}
}
}

void anagrammi(char *string){
anagr("", string);
}

/* Copia in string la parola ottenuta aggiungendo alla parola in
temp il carattere c.*/
void attacca(char *string, char *temp, char c){
int l;
l = strlen(temp);
strcpy(string, temp);
string[l] = c;
string[l+1] = '\0'; /* aggiungo il carattere di fine stringa */
}

/* Copia in word la parola ottenuta togliendo dalla parola in
temp il carattere in posizione k.*/

void elimina(char *string, char *temp, int k){
int i,l;
l = strlen(temp);
for(i=0; i string[i] = temp[i];
for(i=k; i string[i] = temp[i+1];
string[l-1] = '\0';
}

Commenti

Posta un commento