Ricerca appunti sul web

Ricerca personalizzata

sabato 28 febbraio 2009

Sorgenti c : Anagrammi

Scrivere un funzione ricorsiva
che presa in input una stringa (ordinata lessicograficamente) stampi tutti i suoi
anagrammi (permutazioni di caratteri) ordinati in maniera lessicografica.

N.B. Ottimo per il gioco Geo Challenge di Facebook!!!!

/* http://juni0rblog.blogspot.com/ */
/* juni0r87@yahoo.it */
#include <stdio.h>
#include <stdlib.h>
#include <string.h>

#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("%sn", pref);
else{
for(k=0 ; k<stringl ; 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] = ''; /* 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<k ; i++)
string[i] = temp[i];
for(i=k; i<l-1 ; i++)
string[i] = temp[i+1];
string[l-1] = '';
}

0 commenti: