Oppure

Loading
08/11/08 18:03
magicolotto
ragazzi uso in questa grilia dei numeri prelevati in un archivio access

la griglia è 19 x 10
quindi 190 celle

uso dei contatori per effetture la ricerca nella griglia

pero' il codice che uso
è molto lento
ci impiega molto ad analizzare la griglia


vorrei sapere se cè un mdo piu veloce

esempio del codice che uso :


            For row1 = 1 To caricaestraz
             For col1 = 2 To 11
              For row2 = row1 + 1 To caricaestraz
               For col2 = 2 To 11
                For row3 = row2 + 1 To caricaestraz
                 For col3 = 2 To 11
                  For col4 = col3 + 1 To 11
                   DoEvents
                   For row4 = row3 + 1 To caricaestraz
                    For col5 = 2 To 11
                     For col6 = col5 + 1 To 11
                      ProgressBar1.Value = ProgressBar1.Value + 0.0001
                      If col2 - col1 = col5 - col3 And col4 - col3 = col6 - col5 Then
                       If Abs(row2 - row1) = Abs(row4 - row3) Then  ' And Abs(row3 - row2) = Abs(row5 - row3) Then
                       
                         num(1) = CInt(MSHFlexGrid1.TextMatrix(row1, col1))
                         num(2) = CInt(MSHFlexGrid1.TextMatrix(row2, col2))
                         num(3) = CInt(MSHFlexGrid1.TextMatrix(row3, col3))
                         num(4) = CInt(MSHFlexGrid1.TextMatrix(row3, col4))
                         num(5) = CInt(MSHFlexGrid1.TextMatrix(row4, col5))
                         num(6) = CInt(MSHFlexGrid1.TextMatrix(row4, col6))
                           
                         If (num(1) = num(2)) And (num(3) = num(4)) And (num(5) = num(6)) Then
                                         MSHFlexGrid1.row = row1
                                          MSHFlexGrid1.col = col1
                                             MSHFlexGrid1.CellBackColor = vbRed
                                              MSHFlexGrid1.row = row2
                                                 MSHFlexGrid1.col = col2
                                                   MSHFlexGrid1.CellBackColor = vbRed
                                                    MSHFlexGrid1.row = row3
                                                      MSHFlexGrid1.col = col3
                                                       MSHFlexGrid1.CellBackColor = vbGreen
                                                         MSHFlexGrid1.row = row3
                                                          MSHFlexGrid1.col = col4
                                                           MSHFlexGrid1.CellBackColor = vbGreen
                                                            MSHFlexGrid1.row = row4
                                                             MSHFlexGrid1.col = col5
                                                              MSHFlexGrid1.CellBackColor = vbYellow
                                                               MSHFlexGrid1.row = row4
                                                                MSHFlexGrid1.col = col6
                                                                 MSHFlexGrid1.CellBackColor = vbYellow
                  
                         End If
                        End If
                       End If
                     Next col6
                    Next col5
                   Next row4
                  Next col4
                 Next col3
                Next row3
               Next col2
              Next row2
             Next col1
            Next row1
aaa
08/11/08 18:21
P4p3r0g4
Oh my GOD!
non è possibile una cosa del genere!
ci saranno 12 cicli annidati.
mi meraviglio che funzioni il tuo computer mentre gira il programma!!!
devi decisament sfrondare i cicli. ora ci do un occhiatina.

ok ammetto che non conosco il codice risolutivo a causa della mia aberrazione per i database access, quindi non ho mai neanche studiato le varie procedure di interazione tra questi e il vb.

tuttavia a quanto ho capito è una griglia pieni di dati che vanno confrontati tra loro.
per muoversi su una griglia servono due variabili contatore se lavori con 1 variabile per le righe e 1 per le colonne mentre 1 sola se lavori in resti (lasciamo perdere questo caso e lavoriamo in x e y)

anche mettendo che vuoi confrontare tutte le celle tra di loro ti serviranno al massimo 4 variabili x1,y1 ,x2,y2

for x1 = min to max
for y1= min to max
for x2 = min to max
for y2 = min to max
if cella(x1,y1) = cella(x2,y2) then
...
endif
next
next
next
next

il che sarebbe un calcolo computazionale di 19*10*19*10=36100
che non è piccolissimo ma reggibilissimo da un calcolatore.
Ultima modifica effettuata da P4p3r0g4 08/11/08 18:37
aaa
08/11/08 18:35
magicolotto
ok grazie....


io ho cercato di mettere le condizioni di ricerca nei punti + appripriati

gira + veloce... ma è sempre lento


grazie infinite

cmq il pc non siblocca x fortuna
aaa
08/11/08 18:59
P4p3r0g4
Aggiornato il post sopra. dimmi se ho capito bene.
aaa
08/11/08 19:25
magicolotto
si hai capito ...

solo che il confronto che devo fare è tra 3 coppie di numeri

esempio

01-02 prima coppia
03-04 seconda coppia
05-06 terza coppia

queste tre coppie dinumeri
devono avere una particolare caratteristica

cioè essere uguali a due a due

o meglio ancora

non deve essere un numero che non sia uguale agli altri
quindi un numero solo diverso


capito che intendo?

aaa
10/11/08 14:00
P4p3r0g4
ehm.. no.
non capisco.
a parte che un numero che non non e` uguale agli altri vuole dire che e` uguale agli altri

A = {a | Ogni b app B{} | not (not (a = b)) } => A = B

spiegati meglio
aaa
10/11/08 15:45
magicolotto
esempio corretto :
26-28
30-26
28-30
in questo esempio
abbiamo 3 coppie
dove ogni numero risulta due volte

esempio sbagliato :
26-28
30-26
28-29
in questo caso la condizione esclude questa formazione di tre oppie xchè i numeri non sono a due a due
cio ci sono solo due coppie valide
26-26
28-28

oppure esempio ancora valido

26-28
26-28
26-28
tutti numeri uguali


non so se sono stato esauriente...
aaa
11/11/08 15:22
P4p3r0g4
ti propongo questi processi.
a) indicizzare le coppie, quindi creare un vettore di oggetti collection contenenti gli indici del valore.
es
ind(3) sara` la collection che contiene gli indici(le coordinate) di tutti i punti contenenti il valore 3

il tempo di calcolo di questo processo e` lineare.
semplicemente
ind(val).add (indice)

a questo punto fai un ciclo per i valori(intesi come indice di ind(val)).
se il .count della collection e` uguale a 0 o a 1 allora quell'indice non avra` coppie associate, se e` maggiore di uno controlla che negli altri indici contenuti nella collection ci siano valori che si richiamano

es
ind(4) contine 65 49 93

allora se ind(val(65)) ind(val(49)) e ind(val(93)) contengono elementi in comune allora le coppie formate dai valori dell'elemento comune e le coppie i cui indici hanno dato un risulrtato positivo sono uguali due a due.
aaa