Newsgroup: it.comp.lang.c++
Titolo: ALGORITMI

Ho trascorso ore ed ore cercando di scrivere questi 2 algoritmi ....
ma senza ottenere un soddisfacente risultato.
i quesiti sono i seguenti :
1) come posso scrivere un algoritmo (usando possibilmente un ciclo FOR o
WHILE,
o al limite, una funzione)
che calcoli tutte le possibili combinazioni di una stringa composta da N
caratteri ?
esempio ... la stringa CIAO .... come faccio a calcolare i vari CAIO ....
CAOI ..... COAI ...... COIA .... AOIC ... OICA ... OIAC .... OCIA .....
ecc...ecc ?
esiste una precisa "formula" ? un procedimento ? ......
____________________________________
2) simile al primo quesito ... ma questa volta calcolando anche i casi con
"lettere ripetute" .........
per esempio ..... data la stringa "CIAO" .... quindi formata dai caratteri
C, I ,A, O  ....
come posso calcolare i vari CCCC ..... IIII .... AAAA .... OOOO...... CCCA
.... CCCI ... CCCO .... OOOC .... OOAO ... AAIA .... IIAO ......
ICAO ... COIA ..... OOCA .... CCIA ..... AAIC ... OCOA ........ ecc...ecc
.....
cioè tutte le possibile combinazioni utilizzando i caratteri dati ....
usando la lunghezza N della stringa.
mi rendo conto che il risultato è enorme .... specialmente per stringhe
composte da un certo numero di caratteri .............
esiste una precisa "formula" ? un procedimento ? ...... anche per questo
quesito ?
____________________________________________
attendo una risposta, grazie in anticipo.
p.s.
dato che non sono ancora un guru del c++ ... sarei grato
se ricevessi una risposta PIU' CHIARA POSSIBILE ....
ed un algoritmo altrettanto "semplice" e chiaro, con relativa spiegazione.
p.p.s
per favore, non ho bisogno di sentirmi dire di leggere qualche libro di
calcolo combinatorio ............
magari vecchi libri di Fortran .... o roba di questo genere.....
ho solo BISOGNO di SAPERE COME scrivere il codice , se (e
sicuramente SI) è possibile.
ciao.

sicuramente SI) č possibile.
bhe io appartengo alla categoria dei pigri, ma nemmeno tu scherzi ;)
per questo problema basta contare... eg.
999, 998, 997, 996, 995, 994, 993, 992, 991 etc...
Se conosci a priori lunghezza della stringa e numero di digit/caratteri
diversi ti semplifichi molto la vita.
char[] digit="qwerty";
char[3] res;
for (int i=0;i<=5;++i)
    for (int j=0;j<=5;++j)
        for (int k=0;k<=5;++k) {
            res[0]=digit[i];res[1]=digit[j];res[2]=digit[k];
            cout<<res;
        }
se una tabella di look up č troppo grossa, non č detto che trovare una
funzione numero->stringa sia poi cosě facile da trovare.
se ad esempio le lettere fossero consecutive, puoi passare dai numeri ai
caratteri con un addizione oppure modificare il ciclo for.
Le lettere sono una 60ina e una tabella di look up di 60 bytes č
affrontabile ma se fossero ideogrammi cinesi (50.000) mha???
Dipende da quanto tempo hai per avere un risultato.
Altrimenti ti tocca usare i vector e le string e ovviamente non puoi piů
nestare cicli for... perchč non sai a priori quanti sono...

 720 che dovrebbero essere per una stringa di 6 caratteri?
Ho capito perché: le dà tutte solo se parto con una stringa contenente
le lettere in ordine alfabetico. Es.: con ENRICO ne dà 532 (non 534, ho
sbagliato a scrivere) ma con CEINOR ne dà 720, come doveva essere. Con
ABCDEF ne dà 720 mentre con ABCDFE ne dà 719 e con FEDCBA ne dà 1 sola
(o meglio nessuna, in tutto il discorso la prima è sempre la stringa
originale). Quindi sembra che si fermi quando gli viene passata una
stringa con le lettere in ordine alfabetico discendente.
EMG