Homepage  Il progetto dsy.it è l'unofficial support site dei corsi di laurea del Dipartimento di Scienze dell'Informazione e del Dipartimento di Informatica e Comunicazione della Statale di Milano. E' un servizio degli studenti per gli studenti, curato in modo no-profit da un gruppo di essi. I nostri servizi comprendono aree di discussione per ogni Corso di Laurea, un'area download per lo scambio file, una raccolta di link e un motore di ricerca, il supporto agli studenti lavoratori, il forum hosting per Professori e studenti, i blog, e molto altro...
In questa sezione è indicizzato in textonly il contenuto del nostro forum


.dsy:it. .dsy:it. Archive > Didattica > Corsi A - F > Algoritmi e strutture dati
Pages: 1 [2] 
[Progetto] Samegame3
Clicca QUI per vedere il messaggio nel forum
GiKappa
nella struttura dell'albero rb che campi avete inserito? usate solo i puntatori? e dite che bastano solo i puntatori *left, *right e *up o bisogna aggiungerne uno *down?

help!

imperator
ma già con i puntatori left e right discendi l'albero...a sx o dx..
io personalmente non ho aggiunto altri puntatori

GiKappa
quindi la struttura di ogni nodo sarebbe una biglia con le coordinate, il valore e il colore?

perchè non mi è chiaro come usare gli alberi per spostarmi all'interno della scacchiera..

imperator
esatto le informazioni che ti servono all'interno di ogni biglia sono coordinate, colore, valore

GiKappa
ok, però ad esempio se il nodo A contiene la biglia in posizione (x,y), i suoi figli conterranno le biglie in quale posizione?

non sono molto ferrato con gli alberi!:asd:

edit: avevo pensato a fare in modo che i figli a sinistra di un nodo fossero quelli adiacenti per le ascisse, mentre quelli a destra fossero adiacenti per le ordinate, ma mi escono dei doppioni.

imperator
allora se crei un albero di biglie non puoi pretendere che i figli siano le celle adiacenti (anche perchè le biglie adicenti sono 4, mentre tu hai solo 3 puntatori: padre e i 2 figli).
se vuoi una struttura in cui memorizzare una biglia e tenere traccia delle biglie adiacenti devi costruirti un grafo tramite liste di adiacenza.

con un albero le "figlie" di una biglia dipendono da quando inserisci le biglie...
ad esempio...supponi aver una albero lessicografico in cui memorizzi dei colori...
se io inserisco nell'ordine "ocra", "arancione", "marrone"
avro un albero con radice ocra, figlio sx arancione, figlio dx marrone...
ma se inserisco nell'ordine arancione, ocra, marrone avrò un albero con radice arancione che avrà un figlio dx ocra che a sua volta avrà un figlio sx marrone...

quindi con il primo insieme di inserimenti ho un albero con 2 livelli (radice e i due figli)
con secondo insieme di inserimenti ho un albero con 3 livelli (radice [arancione], figlio dx della radice [ocra], figlio sx di ocra [marrone])

cmq se vuoi implementare dei grafi tramite liste di adiacenza puoi guardare alcuni vecchi progetti come "daltonismo"

pirlo21
ragazzi ma voi usate tutti gcc come compilatore? io ne uso un altro e va tutto ok, oggi ho provato gcc perchè il prof dice di usare quello e il programma non funziona più...

darkshadow
che problemi ti da??

cmq ho sempre usato gcc.

pirlo21
mi da qualche warning e se compilo con -ansi anche qualche errore... inoltre quando lancio il programma mi si blocca subito durante l'inserimento dei dati, mentre con l'altro compilatore funziona perfettamente...

darkshadow
forze usi gets o roba simile per le stringhe

GiKappa
Originally posted by imperator
con un albero le "figlie" di una biglia dipendono da quando inserisci le biglie...
ad esempio...supponi aver una albero lessicografico in cui memorizzi dei colori...
se io inserisco nell'ordine "ocra", "arancione", "marrone"
avro un albero con radice ocra, figlio sx arancione, figlio dx marrone...
ma se inserisco nell'ordine arancione, ocra, marrone avrò un albero con radice arancione che avrà un figlio dx ocra che a sua volta avrà un figlio sx marrone...

quindi con il primo insieme di inserimenti ho un albero con 2 livelli (radice e i due figli)
con secondo insieme di inserimenti ho un albero con 3 livelli (radice [arancione], figlio dx della radice [ocra], figlio sx di ocra [marrone])


ok, credo di aver capito: l'albero si costruisce in base a quando inserisco le diverse biglie.
quello che non mi è chiaro è il tuo esempio sui colori. sono due modi di procedere per inserire le biglie?
grazie in anticipo! scusa se ti faccio perdere tempo, ma se capisco come implementare questa cosa, poi sul resto posso ragionarci.

imperator
Originally posted by GiKappa

quello che non mi è chiaro è il tuo esempio sui colori. sono due modi di procedere per inserire le biglie?


si ti ho fatto un esempio per farti vedere come l'albero che si viene a creare può essere diverso, a seconda dell'ordine in cui avvengono gli inserimenti, pur mantenendo lo stesso insieme di colori da inserire

GiKappa
ok! perfetto! era questo che non capivo! grazie!

in fase di esplorazione quale dei due è migliore? quello bilanciato o quello che prosegue con figlio dx-figlio sx?

imperator
attenzione...ho detto che si tratta di un semplice albero binario di ricerca (lessicografica)...non ho detto che questo era bilanciato.
il fatto che un albero sia bilanciato non dipende dagli inserimenti...ma proprio dal tipo di albero;
ad esempio albero RB è bilanciato...ma un generale albero di ricerca non è detto che sia bilanciato...
ad esempio supponi di avere un albaro binario di ricerca i cui nodi contengono degli interi e supponi di inserire nell'ordine 1, 2, 3, 4, 5.
bene questo albero di ricerca degenera sostanzialmente in un lista monodirezionale (1 ha figlio dx 2 che a sua volta a figlio dx 3 che a sua volta a figlio dx 4 etc..)
se usi però un albero RB invece l'albero è bilanciato, grazie alle rotazioni e ai colori dei nodi

greensheep
Originally posted by imperator
tieni presente che non sono delle vere e proprie combinazioni matematiche... hai la regola che se cancelli la colonna x non puoi cancellare la colonna x-1 e x+1...


io non so tuttora che struttura usare per la funzione minore... idee?

GiaXVI
anche io vorrei sapere che struttura utilizzare per la funzione minore, io pensavo a una lista, ma ancora nn ho guardato bene!

ho anche una domanda poco tecnica...se si consegna un progetto che nn implementa tutte le funzioni correttamente il prof te lo boccia o ti viene incontro???

gicagi
compilando con -Ansi mi da il seguente:

<command line>:4:4: missing '(' after predicate

ma non riesco a capire cosa voglia dire....

pirlo21
dovrebbe essere che alla riga 4 hai dimenitcato una (

imperator
qualcuno è riuscito a fare la funzione riduzione?
se si dove ha preso ispirazione?

GiaXVI
che algoritmo bisogna usare secondo voi x vedere quali sono le colonne col valore + alto nelle funzione riduzione???

qualcuno è riuscito a farla????

kalbiz
purtroppo no, ho tentato diverse strade, ma nulla.
anche la funzione per avere i totali per riga, ho usato due indici for in matrice... abbastanza una schifezza ... ma non ho trovato alternative.
voi già per la funzione di calcolo sulle somme righe, cosa avete utilizzato ?

greensheep
nessumo mi può ispirare dicendomi almeno che struttura ha usato per la funzione minore?:sad:

Kira82
Ragazzi io sono rimasta bloccata sulla funzione minore e sulla funzione riduzione...c'è qualcuno che è riuscito a farle e mi può dare qualche suggerimento??

dex

Fredx
qualcuno è riuscito a trovare un algoritmo efficiente per il conteggio del punteggio massimo? io ne ho trovato uno ma non è per nulla efficiente...

per le relazioni tra i colori ho invece usato semplicemente un grafo orientato, ad esempio se giallo è minore di blu, nel grafo giallo è adiacente a blu... sembra funzionare bene...

GiaXVI
nella funzione Fusione come avete fatto a controllare se i 2 blocchi delle biglie date in input sono adiacenti?????

greensheep
Originally posted by Fredx
qualcuno è riuscito a trovare un algoritmo efficiente per il conteggio del punteggio massimo? io ne ho trovato uno ma non è per nulla efficiente...

per le relazioni tra i colori ho invece usato semplicemente un grafo orientato, ad esempio se giallo è minore di blu, nel grafo giallo è adiacente a blu... sembra funzionare bene...


doppio for appena ne trova una adiacente fermo il i 2 for.
nel caso peggiore ho log(n)*log(m)

Kira82
Aiutoooo...ho un problema ( a parte che mi manca da fare ancora la funzione riduzione..si accettano suggerimenti!!)..quando provo il programma funziona, ma se inserisco l'input del prof mi dà problemi. Esattamente il punto è
...
s 0 1
F 0 0 0 1
s 0 1
...
e il problema è che non mi effettua la fusione, ma se tolgo il primo s 0 1 allora la fusione funziona..funziona anche se inserisco un'altra funzione tra s 0 1 e F 0 0 0 1.....???????
qualcuno riesce a spiegarmi perchè?????

Vid
Spiegare il perchè è difficile senza avere il codice sottomano.
La cosa migliore che puoi fare, secondo me, è di giocare al calcolatore.
Armati di carta, matita, gomma, logica e un fottio di pazienza e debuggati il codice, oppure usa un debugger se ti trovi meglio.
Io personalmente uso il primo metodo, e sebbene a volte ci metti ORE a trovare il bug, se ti impegni lo trovi.

La pazienza è la virtù dei forti e la caratteristica che più odio del C è che i bug tendono a nascondersi in parti del codice lontane anni luce da quella in cui si presentano (perlomeno nel mio codice :p )

Kira82
Ma non so se il debugger può essere utile perchè non è che mi restituisce un errore, solo che non fa quello che dovrebbe, ovvero la fusione.
Ho notato che è un problema delle due funzioni, cioè se le metto in successione la seconda non fa il 'suo dovere' ma se sono separate anche da una sola altra funzione tutto è ok.
Secondo voi ho sbagliato qualcosa con i puntatori? O come dice Vid devo debuggare?

Cmq qualcuno mi può dire la logica per trovare le colonne da cancellare nella riduzione..io sono riuscita a scrivere la funzione che somma i valori delle celle di un blocco in una colonna, ma poi come faccio a trovare le colonne che sommate danno il punteggio max??

Larios
per trovare l'errore fai eseguire tutta la sequenza di codice che ti da problemi, aggiungendo dei return per esempio che ti fanno terminare il programma dopo poche operazioni...poi ne fai eseguire altre in piu se quelle funzionano e cosi via... con un po di pazienza troverai il punto esatto che ti da l'errore... usa anche printf per verificare i dati che entrano sulle funzioni che testi.

Kira82
Ho trovato il punto, sembra che dopo l'input di 's' oppure 'F' non entri nel case successivo.
Cioè ho provato a creare un case 'w' che esegue un printf, se metto
s 0 1
w 0 0
F 0 0 0 1
il programma esegue correttamente la 's' e la 'F' ma salta la 'w'; viene la stessa cosa con i case dopo 'F' cioè con
F 0 0 0 1
w 0 0
s 0 1
Non capisco perchè non mi entra nei case se li metto in input dopo la 's' o la 'F'.........aiutoooooooooooooooo!


Risolto..ho trovato l'errore!:)

greensheep
raga come faccio a testare se il progetto funziona con gcc?
ho scaricato lo zip e ora?

lackno
lo apri, vai su dos, vai nella cartella dove l'hai aperto (non devi installare niente da li mi sembra) e poi esegui gocs
dopo usi il solito gcc -blabla prog.c

Kira82
Scusate ma che logica avete usato per calcolare la somma massima delle colonne..come faccio a fare tutte le somme possibili?

Larios
io lo sto impostando in questo modo...anche se non è per niente facile questa parte devo dire :/

per trovare tutte le combinazioni di somme generiche...

esempio 1 2 3

trovo tutte le combinazioni di somme partendo da 1

fai 1 + 2 parte la ricorsione sul 2
2 + 3

3 non ha combinazioni e ritorna il suo valore... quindi 2+3=5 ritorni questo valore e 1+2 = 6

poi fai 1 3= 4

fine combinazioni partendo da 1....

e poi vai avanti col numero successivo il 2 che avra solo 2 3 e quindi 5.

e poi il 3 che fa 3...

da qui ti fai tutti confronti di volta in volta e tiri fuori il punteggio piu alto, devi anche salvarti le posizioni(gli indici delle colonne) man mano perchè poi devi sapere che colonne hanno formato il totale migliore e saranno da cancellare.

darkshadow
adesso sto testando il programma e fino ad un certo punto tutto va bene poi i risultati che ci sono nel nesto non coincidono più con i miei.

l'input è:

i 6 3 0 0 f1.txt
i 4 5 -4 -2 f2.txt
i 6 3 0 -6 f1.txt
b 0 -1 6 blu
n
i 1 5 -4 2 f3.txt
i 1 5 -5 -3 f3.txt
b 0 -4 2 giallo
n
s 0 1
r 0 1
< rosso bianco
< bianco blu
< blu rosso
s 0 1
F 0 0 0 1
s 0 1
r 0 1
b 0 -1 8 blu
F 0 -1 0 -2
F 1 -3 -3 -1
r 0 -1
n
r 0 2
< giallo azzurro
< azzurro bianco
F -2 -1 -2 -2
n
b 1 -2 12 blu
b -4 -4 3 blu
r -3 0             // da questo punto alcuni risultati non coincidono più
i 1 5 -6 1 f3.txt
F -1 1 -6 1
F 1 3 2 5
r 1 3
r 1 3
n
r -1 1
r -6 -3
r -6 -3
r -6 1
r -6 1
r -6 1
n
f

ho fatto tutti i grafici a mano per vedere se era il programma che non andava o se c'e' qualche errore nel testo.

facendo i conti mi ritrovo che il totale di ciascuna colonna è:

colonna x = -5   totale = 1
colonna x = -4   totale = 7
colonna x = -3   totale = 10
colonna x = -2   totale = 8
colonna x = -1   totale = 3
colonna x = 0    totale = 15
colonna x = 1    totale = 23
colonna x = 2    totale = 7

nel testo dice che il punteggio massimo è : 38
ma invece il punteggio massimo che si può ottenere è 37.
Tale risultato si ottiene eliminando le colonne: x = -4, x = -2, x = 0 e x = 2

qualcuno di voi può confermare???

imperator
se prendi le colonne -4, -2 e 1 il totale è 38

darkshadow
azz hai ragione!!

devo rivedere il codice della riduzione.

il resto sembra andare bene.

Speriamo!!!

Forza raga che ci siamo quasi.

Fredx
Originally posted by darkshadow
facendo i conti mi ritrovo che il totale di ciascuna colonna è:

colonna x = -5   totale = 1
colonna x = -4   totale = 7
colonna x = -3   totale = 10
colonna x = -2   totale = 8
colonna x = -1   totale = 3
colonna x = 0    totale = 15
colonna x = 1    totale = 23
colonna x = 2    totale = 7

nel testo dice che il punteggio massimo è : 38
ma invece il punteggio massimo che si può ottenere è 37.
Tale risultato si ottiene eliminando le colonne: x = -4, x = -2, x = 0 e x = 2

qualcuno di voi può confermare??? [/B]


no, è giusto 38, che si ha cancellando la colonne -4, -2 e 1.
8 + 7 + 23 = 38

kalbiz
oramai a titolo informativo .... questo output dopo il primo comando s 0 1 (è uguale al testo)

(blu
0,1 valore : 1
1,1 valore : 1
1,0 valore : 3
1,-1 valore : 2
2,-1 valore : 8
0,-1 valore : 6
-1,-1 valore : 6
-1,-2 valore : 2
)

mi spiegate come è possibile che le colonne di valore massimo diano giustamente 16, dovrei eliminare, tutte le biglie che stanno quindi sulla colonna x= -1 e x = 2 (la cui somma è 16)
quindi eliminerei
(-1,-1)
(-1,-2)
(2,-1)
ok se elimino solo queste biglie, come è possibile che dopo la prima riduzione alla seconda richiesta di s 0 1
vengano stampate solo due biglie ????
quando riduco e stabilizzo le biglie si dovrebbero ricompattare e riformare il blocco ...

kalbiz
ok ho trovato l'errore ... la riduzione non spostava le biglie correttamente in x-1

GiaXVI
sbaglio o il calendario x gli eventuali orali tarda ad uscire???

alexn1
Originally posted by GiaXVI
sbaglio o il calendario x gli eventuali orali tarda ad uscire???


Sono usciti... Che fatica essere ammessi all'orale di 'sto esame!

Java
perchè io non li trovo?

alexn1
Originally posted by Java
perchè io non li trovo?


Per quelli di Torelli / Aguzzoli:

http://homes.dsi.unimi.it/~aguzzoli/algo.htm

fai magari un ctrl+F5 così forzi il refresh della pagina.

Java
vero vero....

il pc del lavoro qua è un rottame :D

Powered by: vbHome (lite) v4.1 and vBulletin v2.3.1 - Copyright ©2000 - 2002, Jelsoft Enterprises Limited
Mantained by dsy crew (email) | Collabora con noi | Segnalaci un bug | Archive | Regolamento |Licenze | Thanks | Syndacate