Questo sito utilizza cookies solo per scopi di autenticazione sul sito e nient'altro. Nessuna informazione personale viene tracciata. Leggi l'informativa sui cookies.
Username: Password: oppure
Algoritmi - Non so che titolo dare a questo thread...
Forum - Algoritmi - Non so che titolo dare a questo thread... - Pagina 2

Pagine: [ 1 2 ] Precedente | Prossimo
Avatar
Roby94 (Member)
Guru


Messaggi: 1170
Iscritto: 28/12/2009

Segnala al moderatore
Postato alle 15:02
Domenica, 27/08/2017
Aldo qui si cerca solo di aiutarti, non ti additeremo come quello che non sa creare funzioni ricorsive, siamo qui tutti per migliorare.
Detto questo è giusto che tu ti metta nella condizione di apprendere questa tecnica al meglio, magari tentando di riscrivere funzioni che normalmente verrebbero implementate iterativamente con un approccio ricorsivo.
Passiamo ora al tuo codice, sinceramente non riesco a capirlo, ho anche provato a compilarlo ma il risultato non mi ha convinto. Ho provato a dare una mia interpretazione.

Codice sorgente - presumibilmente C++

  1. #define H 10//numero di righe
  2. #define W 10//numero di colonne
  3.  
  4.  
  5. int n;
  6. bool v[H][W];//matrice che indica se una casella è stata visitata
  7. int m[H][W];//matrice che contiene i "colori" delle celle
  8.  
  9. int rec(int m[H][W], bool v[H][W], int i, int j, int* n)
  10. {
  11.         v[i][j] = true;//imposto la casella corrente come visitata
  12.         (*n)++;//Aumento il contatore delle caselle simili
  13.  
  14.         //eseguo la ricerca nelle 4 direzioni verificando se:
  15.         //primo, la casella esista (problema dei bordi)
  16.         //secondo, la casella non sia già stata visitata
  17.         //terzo, la casella sia dello stesso colore
  18.         //se le tre richieste sono soddisfatto riapplico il metodo corrente alla prossima cella(da ogni iterazione possono partire da 0 a 4 nuove iterazioni
  19.         if (i - 1 != 0 && v[i - 1][j] == false && m[i - 1][j] == m[i][j]) rec(m, v, i - 1, j, n);
  20.         if (j - 1 != 0 && v[i][j - 1] == false && m[i][j - 1] == m[i][j]) rec(m, v, i, j - 1, n);
  21.         if (i + 1 != H && v[i + 1][j] == false && m[i + 1][j] == m[i][j]) rec(m, v, i + 1, j, n);
  22.         if (j + 1 != W && v[i][j + 1] == false && m[i][j + 1] == m[i][j]) rec(m, v, i, j + 1, n);
  23. }


Codice sorgente - presumibilmente Plain Text

  1. //esempio sulla casella (5,5)
  2. n = 0;
  3. rec(m, v, 5, 5, &n);
  4. printf("%d", n);


Spero che questo esempio possa aiutarti a capire una generica implementazione ricorsiva.

PM Quote
Avatar
AldoBaldo (Member)
Guru


Messaggi: 699
Iscritto: 08/01/2015

Segnala al moderatore
Postato alle 15:17
Domenica, 27/08/2017
Nel frattempo, non avendo ancora letto la tua ultima risposta, ho messo insieme una inutility che disegna matrici d'adiacenza secondo i criteri che dicevi: sono adiacenti le caselle dello stesso colore sopra, sotto, a destra o a sinistra. L'inutility crea matrici da tabelle a tre colori fino a un massimo di 26*26 caselle, in effetti allocando tutto dinamicamente, quindi le traspone graficamente in un file in formato svg. Esempio (file generato dal programma) in allegato.

Certo hai ragione a definire "scontate" le tabelle di quel tipo, DAL TUO PUNTO DI VISTA. Il mio punto di vista è molto più raso-terra, per cui penso che proprio soffermarmi per un po' sulle cose più semplici potrebbe aiutarmi a comprendere qualcosa (forse).

L'algoritmo che mi ha suggerito Roby l'ho capito, infatti è la prima cosa che m'è venuta in mente anche in autonomia, solo che non sono riuscito a trasformarlo in qualcosa di funzionante sul lato codice perché mi si grippa tutto nel cranio. :( Insisterò.

P.S. quanto meno le matrici di adiacenza che butta fuori la mia inutilty potrebbero andare bene come schemi per qualche lavoretto astratto a punto croce. :D

EDIT: Nel frattempo, Roby, è arrivata la tua risposta che, a colpo d'occhio, non mi dice niente. Ora mia metto lì e cerco di capirla. Forza e coraggio! (l'incoraggiamento me lo rivolgo da solo, porca pupazza!)

Ultima modifica effettuata da AldoBaldo il 27/08/2017 alle 15:22


ATTENZIONE! Sono un hobbista e l'affidabilità delle mie conoscenze informatiche è molto limitata. Non prendere come esempio il codice che scrivo, perché non ho alcuna formazione accademica e rischieresti di apprendere pratiche controproducenti.
PM Quote
Avatar
AldoBaldo (Member)
Guru


Messaggi: 699
Iscritto: 08/01/2015

Segnala al moderatore
Postato alle 15:24
Domenica, 27/08/2017
Non allega... ci riprovo qui.

EDIT: Forse ho capito... che non "prenda" i file svg? Provo con zip.


AldoBaldo ha allegato un file: matrice_adiacenza.zip (8207 bytes)
Clicca qui per scaricare il file

Ultima modifica effettuata da AldoBaldo il 27/08/2017 alle 15:26


ATTENZIONE! Sono un hobbista e l'affidabilità delle mie conoscenze informatiche è molto limitata. Non prendere come esempio il codice che scrivo, perché non ho alcuna formazione accademica e rischieresti di apprendere pratiche controproducenti.
PM Quote
Avatar
Roby94 (Member)
Guru


Messaggi: 1170
Iscritto: 28/12/2009

Segnala al moderatore
Postato alle 15:31
Domenica, 27/08/2017
Testo quotato

Postato originariamente da AldoBaldo:

EDIT: Nel frattempo, Roby, è arrivata la tua risposta che, a colpo d'occhio, non mi dice niente. Ora mia metto lì e cerco di capirla. Forza e coraggio! (l'incoraggiamento me lo rivolgo da solo, porca pupazza!)


è esattamente l'algoritmo che ti ho proposto a parole nei post precedenti, prova a confrontare le due cose e se hai dubbi chiedi, siamo qui per questo :k:

PM Quote
Avatar
AldoBaldo (Member)
Guru


Messaggi: 699
Iscritto: 08/01/2015

Segnala al moderatore
Postato alle 15:56
Domenica, 27/08/2017
Roby, con il metodo che mi hai suggerito, se l'ho capito bene, metti in relazione le caselle dello stesso colore che sono in contatto tra loro, il che va benissimo. Non ho capito, però, com'è che fai a scoprire le varie aree oltre alla prima, quelle che non sono collegate alla prima (magari perché sono di un altro colore, o perché sono dello stesso colore ma in una zona diversa del diagramma).

Forse che semplicemente riavvi la ricorsione a partire dalla prima casella "non visitata" che trovi?

Ultima modifica effettuata da AldoBaldo il 27/08/2017 alle 15:59


ATTENZIONE! Sono un hobbista e l'affidabilità delle mie conoscenze informatiche è molto limitata. Non prendere come esempio il codice che scrivo, perché non ho alcuna formazione accademica e rischieresti di apprendere pratiche controproducenti.
PM Quote
Avatar
Roby94 (Member)
Guru


Messaggi: 1170
Iscritto: 28/12/2009

Segnala al moderatore
Postato alle 16:12
Domenica, 27/08/2017
Io non avevo idea di come sarebbe stato applicato l'algoritmo, questa è un implementazione generica che calcola il numero di caselle congruenti con una di partenza. Poi sta a te creare un implementazione specifica per il tuo problema. Comunque se vedi la funzione elimina in automatico le caselle già visitate, quindi se volessi controllare l'intera mappa per ottenere tutte le zone con relative dimensioni ti basterebbe applicare la funzione ad ogni singola casella della griglia (ovviamente bloccando il processo per ogni casella gia visitata).

PM Quote
Avatar
AldoBaldo (Member)
Guru


Messaggi: 699
Iscritto: 08/01/2015

Segnala al moderatore
Postato alle 16:25
Domenica, 27/08/2017
Sì, come immaginavo. Poi bisogna vedere se riuscirò a passare dall'aver compreso la questione di concetto al renderla praticamente operativa. Oggi no. Ci proverò domani, dopo avere distolto per un po' la testa da queste cose.

Ovviamente, un grazie grosso come una casa.

Ultima modifica effettuata da AldoBaldo il 27/08/2017 alle 16:26


ATTENZIONE! Sono un hobbista e l'affidabilità delle mie conoscenze informatiche è molto limitata. Non prendere come esempio il codice che scrivo, perché non ho alcuna formazione accademica e rischieresti di apprendere pratiche controproducenti.
PM Quote
Avatar
lumo (Member)
Expert


Messaggi: 449
Iscritto: 18/04/2010

Segnala al moderatore
Postato alle 14:47
Sabato, 02/09/2017

PM Quote
Pagine: [ 1 2 ] Precedente | Prossimo