PDA

View Full Version : [VBA] difficile grafi e permutazioni


xp2400
15-01-2016, 11:20
:D Help... sono bloccatissimo.

Ho un array di questo tipo (semplificando molto...)
423
422
421
413
412
411
322
321
312
311
221
211
121
111

ogni prima cifra di ogni elemento indica il livello (es. 322 č un elemento di 3 livello).
devo costruire Tutti i percorsi per arrivare a un elemento dell'array, partendo dal livello 1, facendo in modo che tutti i percorsi abbiamo solo un elemento per ogni livello inferiore.

quindi per arrivare all'elemento 322 (terzo livello), i percorsi possibili sono
221 - 121
221 - 111
211 - 121
211 - 111

per arrivare all'elemento 411 (quarto livello)

322 - 221 - 121
322 - 221 - 111
322 - 211 - 121
322 - 211 - 111
321 - 221 - 121
321 - 221 - 111
321 - 211 - 121
321 - 211 - 111
312 - 221 - 121
312 - 221 - 111
312 - 211 - 121
312 - 211 - 111
311 - 221 - 121
311 - 221 - 111
311 - 211 - 121
311 - 211 - 111


Ho iniziato con le permutazioni con ripetizione, per creare tutte le possibili soluzioni e poi ripulire quelle con livelli ripetuti, ma siamo a godziliardi per il livello 9... quindi non ne esco.. e non ho studiato i grafi a scuola...

xp2400
18-01-2016, 08:09
nessuno??

Daniels118
26-01-2016, 15:53
Pazzia!
E' molto pių semplice di quello che pensi.
Prima di tutto ti conviene suddividere l'array iniziale in n array, uno per livello (non č indispensabile ma semplifica e rende pių efficiente l'implementazione), e mettere questi array in un ulteriore array (puoi farlo creando un nuovo type).
A questo punto implementi una funzione ricorsiva che crea il risultato prendendo di volta in volta un solo elemento da ogni gruppo... č pių facile a farsi che a dirsi.

xp2400
29-01-2016, 16:00
effettivamente....

creando una serie di array uno per livello, e 9 cicli for annidati creo tutti i percorsi.

ma come si crea un array di array?

Daniels118
29-01-2016, 19:53
Come dicevo, puoi farlo creando un nuovo type, esempio:
Private Type StringArray
items() As String
End Type

Dim livelli() As StringArray
ReDim livelli(9)
ReDim livelli(0).items(99)
livelli(0).items(0) = "aaa"

xp2400
10-02-2016, 13:58
mi hai aperto un mondo... funziona alla grandissima!!!

GRAZIE!