 | |
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 |
Progetto "DIE HARD" Clicca QUI per vedere il messaggio nel forum |
nevRotico |
Le operazioni base infatti anche io le ho implementate con un semplice array bidimensionale :) |
f3d386 |
@palaz
tu il controllo per vedere se una configurazione è già stata creata o meno come l'hai fatto?
xchè io alla fine non sono riuscito a far niente di più che far scorrere la lista coi nodi già generati e per ogni elemento della lista scorrere l'array dei livelli...
solo che così non è molto efficiente |
palaz |
beh innanzi tutto non so se quello che ho fatto va bene.. lo scopriro solo il 22.. ma in pratica ogni volta che creo un nodo lo lego al padre... prima di legarlo io chiamo una funzione di ricerca in ampiezza che scorre tutta la mia struttura.... mentre l'ultima funzione l'ho implementata su una coda perché era un po piu incasinata con la ricorsione e andavo a sovrascrivere dei valori...
diciamo che con questo metodo per le prime due funzioni sono sicuro di non creare doppioni di configurazioni e anche di mandare mail il programma in loop perché mi tengo sempre da parte in una coda i nodi che sono ancora da analizzare(cioè di cui devono ancora essere create le configurazioni).. |
francescoo |
ok..io avevo usato le liste anche per le operazioni elementari..
quindi voi consigliate di usare un array bidimensionale di n colonne(n è il numero di contenitori) e 2 righe(una per la cap e una per i litri contenuti)? |
ste182 |
array bidimensionale = matrice (giusto ?)
io ho semplicemente usato un array di strutture.
la struttura rappresenta un contenitore e ha 2 campi: stato e livello.
ogni elemento dell'array è dunque un elemento struct e accedo ai campi semplicemente facendo vettore[i].livello oppure vettore[i].stato.
ps: ragazzi non mandatemi messaggi privati o richieste di msn, non sono mica un call center :D
se postate qui i vostri problemi, cercherò di aiutarvi e così magari aiutiamo anche altri che hanno il vostro stesso problema.
Comunque io non sono riuscito a consegnare per il primo appello, adesso sto cercando di implementare le funzioni per l'appello successivo. |
nevRotico |
Esatto e quindi ho:
contenitori[cont][0] che contiene lo stato del contenitore e contenitori[cont][1] che contiene il livello massimo del contenitore :)
Ovviamente non potendo sapere a priori quanti contenitori verranno creati con il comando N contenitori viene allocato dinamicamente. |
francescoo |
ciao a tutti,
vorrei chiedervi delle delucidazioni in merito alla funzione configurazioni (d):
mettiamo che io sono in 0[3] 5[5]
e d è 3
io devo stampare tutte le pox combinazioni che si possono trovare in 3 passi:
quindi come questo: svuota[2]-riempi[1]-travasa[1][2]
oppure stesse operazioni per d volte(ovviamente se possibile)e quindi non come l'esempio fatto sopra:
quindi riempi riempi riempi
svuota svuota scuota
travasa travasa travasa
??
spero di essermi spiegato.. |
palaz |
io ho fatto cosi:
se mi chiede con zero passi restituisco la configurazione base
con un passo faccio tutti i possibili casi quindi con i ltuo imput sarebbe 00 . 35 . 32
con due passi rifaro tutti i pasaggi un'altra volta ottenendo :
da 00: 30 . 05
da 35: nulla perche se no ripeterei configurazioni appena trovate dal passo 00
da 32: 02 . 35
e cosi via per ogni passo
con questo metodo l'imput del prof corrisponde....
spero di averti chiarito i dubbi :D |
sko02 |
Raga vi spiego perché un array bidimensionale non è la struttura dati migliori (secondo la prof. Lonati):
code:
Per un numero abbastanza grande di contenitori non è detto che nella memoria ci sia abbastanza spazio (consecutivo)
per l'allocazione della memoria necessaria per contenere l'intero array...
Io stò cercando di mettere a punto quello che secondo me è il miglior compromesso
e cioé un albero 2- e 3-nodi o il red-black ....
certo così i tempi di per la ricerca della posizione si allunga non è più immediato
come per un array ma almeno nel caso peggiore è log N per qualsiasi posizione |
asterix07 |
ma il prototipo della funzione deve seguire quello del progetto o è a nostra discrezione? Mi spiego meglio:
Nel testo del progetto la funzione visualizza viene definita come
visualizza();
io ad esempio poso crearla come
visualizza( struct...);
(cioè passandogli un parmetro) |
ste182 |
è a nostra discrezione.. |
arfish |
Ragazzi ma se i risultati del sono identici a quelli del prof. ma non nello stesso ordine??? Va bene lo stesso??? |
ste182 |
Originally posted by arfish
Ragazzi ma se i risultati del sono identici a quelli del prof. ma non nello stesso ordine??? Va bene lo stesso???
basta che siano giusti... l'ordine credo dipenda da come hai implementato le funzioni(ad esempio inserisci un nodo in testa anzichè in coda, quindi stampi in ordine inverso a quello del prof..):D |
francescoo |
ciao,
dpo tutto mi sono accorto ora di avere un problema all'inizio..
nell'inserimento delle capacità io ho utilizzato un
while(getchar()!='\n')
{
se diverso da ' ' inserisco il valore nel vett
}
il problema è che usando il getchar il valore è un carattere che vado a inserire in un vett di caratteri che poi trasformo in intero..
il problema è che cosi facendo prende numero <10
perche se inserisco 10 il getchar me li prende come 2 numeri diversi..
quindi mi fa un cont da 1 e un cont da 0..
ho provato a fare sempre il while con il getchar e poi all'interno lo scanf ma si blocca..
help me.. |
ste182 |
Originally posted by francescoo
ciao,
dpo tutto mi sono accorto ora di avere un problema all'inizio..
nell'inserimento delle capacità io ho utilizzato un
while(getchar()!='\n')
{
se diverso da ' ' inserisco il valore nel vett
}
il problema è che usando il getchar il valore è un carattere che vado a inserire in un vett di caratteri che poi trasformo in intero..
il problema è che cosi facendo prende numero <10
perche se inserisco 10 il getchar me li prende come 2 numeri diversi..
quindi mi fa un cont da 1 e un cont da 0..
ho provato a fare sempre il while con il getchar e poi all'interno lo scanf ma si blocca..
help me..
io ho costruito una funzione così:
code:
leggi_input(vett *v){
int n,c;
v->i=(int *)malloc(sizeof(int));
v->dim=0;
while((c=getchar()) != '\n')
{
scanf ("%d", &n);
v->i=(int *)realloc(v->i,(v->dim+1)*sizeof(int));
v->i[v->dim]=n;
v->dim++;
}
}
struct vett{
int dim;
int i*;
}
|
francescoo |
praticamente è quello che ho fatto anche io..
pero alcune volte va altre si blocca del tutto..viene fuori il messaggio di windows che si è bloccato..
dici che puo essere xke sbaglio nel deallocare?
qlcn sa il motivo di questo errore? |
francescoo |
forse ho risolto..quando eseguivo la malloc non mettevo sizeof(int) e quindi probabilmente andava fuori..
puo essere questo il motivo per cui il programma si bloccava? |
ste182 |
e cosa mettevi?? comunque nella malloc devi specificare la grandezza dell'area da allocare, quindi direi che sizeof è necessario :D |
BeppeGoal |
Scusate, ho qualche dubbio...
- L'operazione "e", esiste, stampa sì o no a seconda che dalla configurazione attuale sia possibile o meno raggiungere una configurazione in cui almeno un contenitore ha livello k.
Almeno intende che sia minino k o "esattamente" k?
Per l'operazione "raggiungibile", invece, voi come l'avete interpretata? Sono fermo perché ho diverse ipotesi, ma non riesco a implementare in modo efficiente. |
palaz |
beh deve raggiungere esattamente k...
raggiungibile è la stessa cosa di esiste sol oche si controlla tutta la configurazione invece che un campo alla volta.. |
ste182 |
ragazzi non riesco a capire sta funzione:
code:
- pericolosa(a)
Dato un vettore a = (a1 , a2 , . . . , an ) di interi positivi, dichiara “pericolosa” la configurazione
in cui il contenitore i ha livello ai . Questo implica che questa configurazione
non potrà più essere utilizzata nel calcolo di altre operazioni (quali ad esempio contenenti(k) o mosse(k))
fino a quando non sia nuovamente dichiarata come innocua con l’operazione innocua(a) descritta sotto.
In particolare se una operazione elementare trasforma la configurazione attuale in una configurazione pericolosa,
l’operazione non deve essere eseguita, e deve essere stampato il messaggio OPERAZIONE PERICOLOSA.
e fin qui ok, poi c'è l'esempio:
code:
>w 2
(3[3],2[5])
(0[3],2[5])
(2[3],0[5])
(2[3],5[5])
>p 2 0
>w 2
(2[3],5[5])
dopo p 2 0, il comando w 2 stampa solo 2[3] 5[5].. ma scusate: la configurazione 3[3] 2[5] ad esempio può essere raggiunta facendo 0[3] 0[5] -> 0[3] 5[5] -> 3[3] 2[5] che non passa per 2[3] 0[5] !!!
non capisco:(
ho mandato una mail al prof e ha risposto:
code:
le configurazioni pericolose al momento di eseguire il secondo w 2
sono:
(0[3],5[5])
(3[3],5[5])
(2[3],0[5])
Quindi tre delle quattro configurazioni contenenti un 2 non
sono piu' raggiungibile, mentre rimane raggiungibile,
attraverso una strada che non passa per (2[3],0[5]),
la configurazione (2[3],5[5]).
|
gek |
scusate qualcuno è riuscito a implementare la funzione mosse(k) in tempo accettabile? più ci penso e più mi sembra np-completo...
grazie |
ste182 |
Originally posted by gek
scusate qualcuno è riuscito a implementare la funzione mosse(k) in tempo accettabile? più ci penso e più mi sembra np-completo...
grazie
np-completo?? ma no: se implementi tutto con un grafo, ogni arco avrà peso 1, quindi una visita in ampiezza ti fornisce il sottografo(albero) dei cammini minimi...
:D |
francescoo |
per ste182:
non so se hai gia risolto..
comunque ha ragione il prof..
perche prima di arrivare li tu hai gia dichiarato altre configurazioni come pericolose..che sono appunto
p 0 5
p 3 0(che pero poi togli facendo - i 3 0)
p 3 5
p 2 0 |
gek |
Originally posted by ste182
np-completo?? ma no: se implementi tutto con un grafo, ogni arco avrà peso 1, quindi una visita in ampiezza ti fornisce il sottografo(albero) dei cammini minimi...
:D
cosa intendi con implementare con un grafo °?° salvare tutte le configurazioni possibili in memoria non è certo accettabile.
Illuminami plx! |
palaz |
beh.. se non ti crei tutte le soluzioni non puoi fare nulla.. io mi sono creato tutte le possibili soluzioni e da li facevo i calcoli... |
gek |
Originally posted by palaz
beh.. se non ti crei tutte le soluzioni non puoi fare nulla.. io mi sono creato tutte le possibili soluzioni e da li facevo i calcoli...
esatto...l'uso di memoria non è accettabile.Il problema mosse(k) è np-completo, non capisco perchè sia presente all'interno del progetto....
ma il progetto per essere valutato deve contenere tutte le funzioni accettabili per tempo e spazio e funzionanti?? |
palaz |
ma no.. non è cosi malato.. a me ha dato 26 in questo progetto solo perche creavo le soluzioni mano a mano che svolgevo le funzioni.. mentre lui avrebbe voluto che rimanessero sempre in memoria per non sprecare il tempo dedicato a generarle dato che son sempre quelle... è impossibile non occupare della memoria... l'importante è non occuparla a cazzo... |
gek |
Originally posted by palaz
ma no.. non è cosi malato.. a me ha dato 26 in questo progetto solo perche creavo le soluzioni mano a mano che svolgevo le funzioni.. mentre lui avrebbe voluto che rimanessero sempre in memoria per non sprecare il tempo dedicato a generarle dato che son sempre quelle... è impossibile non occupare della memoria... l'importante è non occuparla a cazzo...
ah! bhè allora complimenti per il voto! mi metto subito all'opera per un bell'algoritmo non accettabile!
grazie. |
palaz |
ahahh in ogni caso il prof è flessibile l'importante è che fai le cose con criterio e cerci almeno teoricamente una seconda opzione che possa essere migliore.... buon lavoro |
gek |
Dato che ci sono ne approffitto pe farti un'altra domanda dato che hai già consegnato, nel file pdf cosa hai messo?
grazie |
palaz |
beh ho messo tutto il codice commentato... e una veloce relazione di 4 paginette dove descrivo come prendo l'input come gestisco i comandi e molto sommariamente alcuni costi.. tipo usavo una coda e dicevo che le operazioni costano 1.... ma non me ne ha manco parlato il prof.... |
gek |
Originally posted by palaz
beh ho messo tutto il codice commentato... e una veloce relazione di 4 paginette dove descrivo come prendo l'input come gestisco i comandi e molto sommariamente alcuni costi.. tipo usavo una coda e dicevo che le operazioni costano 1.... ma non me ne ha manco parlato il prof....
grazie caro... :P |
ste182 |
Originally posted by francescoo
per ste182:
non so se hai gia risolto..
comunque ha ragione il prof..
perche prima di arrivare li tu hai gia dichiarato altre configurazioni come pericolose..che sono appunto
p 0 5
p 3 0(che pero poi togli facendo - i 3 0)
p 3 5
p 2 0
argh, è vero! :oops: |
ste182 |
cmq generare tutte le possibili combinazioni e salvarle in una struttura è l'unico modo(o almeno credo).. al massimo si può ottimizzare la parte in cui fai i calcoli per generare tutte le combinazioni |
Utopia |
Ragazzi come avete risolto il problema della ricerca di un configurazione nel grafo?
esempio: come faccio a sapere che strada prendere per raggiunge la configurazione 3[3],4[5] dalla radice ? cosi a caso, esploro tutte le possibili... o avete messo delle chiavi ? |
francescoo |
ciao,
ho un paio di domandine:
1)per deallocare un matrice ad esempio la matrice **mat,basta fare free(mat)?o la devo mettere dentro un for?
2)io ho la mia lista v,per scorrerla e pero tenere cmq un riferimento alla testa della lista uso un altro puntatore di tipo lista che chiamo l1, e quindi pongo l1=v, ora questo l1 all'inizio devo fare l1=malloc....?penso di no..perchè va a puntare la lista gia creata e quindi non gli devo allocare spazio giusto?
3) per chi ha gia fatto l'orale con torelli..cosa chiede all'orale?
grazie mille |
palaz |
allora per la domanda 2 non devi allocare l1 perche punta a una porzione di memoria gia esistente... quindi hai ragione :D
per la prima domanda... se è un doppio puntatore prima devi deallocare tutti i nodi puntati poi puoi deallocare mat;
infine.. all'orale torellli fa tre domande.. una sulla prima parte, cioè algoritmi di ordinamento, una sulla seconda ad es tabelle hash e una sulla parte finale, a me è capitata la domanda sulla differenza tra algoritmi greedy e programmazione dinamica.... detto cosi sembra una cazzata ma vuole sapere le cose molto nel particolare, anche se ti da una mano e ti fa ragionare |
francescoo |
@palaz:
ma quindi te la teoria dove l'hai studiata?sulla dispensa di algoritmi o su altre fonti?
e lui vuole sapere anche i tempi di calcolo p cmq le cose nel specifico?
perchè io per ora sto guardando quello che lui ha scritto sul suo sito e studiando dalla dispensa..
pero non sapevo(anche perchè è molto difficile) se imparare proprio a memoria tutti i logaritmi,tempi di calcolo ecc.. |
palaz |
beh studi dal libro anche...
tipo: la mia prima domanda è stata: parlami del merge sort... sono partito con lo spiegare come è l'algoritmo...e lui appena ha visto che lo sapevo mi ha fermato e ha iniziato a chiedermi tempi... se ci sono problemi con la memoria.. di quanto cresce.. se è asintotico e perche..
insomma cose di questo tipo... |
plafo |
Originally posted by palaz
beh studi dal libro anche...
tipo: la mia prima domanda è stata: parlami del merge sort... sono partito con lo spiegare come è l'algoritmo...e lui appena ha visto che lo sapevo mi ha fermato e ha iniziato a chiedermi tempi... se ci sono problemi con la memoria.. di quanto cresce.. se è asintotico e perche..
insomma cose di questo tipo...
quanto tempo ci vuole, secondo te, per studiare in modo decente la teoria? |
palaz |
eh tanto.. io me la sono vista prima e dopo il progetto e in ogni caso ho fatto un orale di merda! |
francescoo |
@palaz:
quindi se ho capito bene per deallocare la matrice:
ad esempio ho una matrice di 2 righe e n colonne io l'ho allocata cosi:
matr = malloc ( 2 * sizeof ( int * ) );
for ( r = 0; r < 2; r++ )
{
*(m+r) = malloc ( n * sizeof ( int ) );
}
quindi per deallocarla:
if(mat!=NULL)
{
for ( r = 0; r < 2; r++ )
{
free(mat+r);
}
free(mat);
}
giusto?e un modo per verificare se l'ho deallocata? |
palaz |
penso sia giusto... per verificare .. no so.. prova a stampare dopo che l'hai allocata i valori che conteneva prima della deallocazione... |
ste182 |
Originally posted by francescoo
@palaz:
quindi se ho capito bene per deallocare la matrice:
ad esempio ho una matrice di 2 righe e n colonne io l'ho allocata cosi:
matr = malloc ( 2 * sizeof ( int * ) );
for ( r = 0; r < 2; r++ )
{
*(m+r) = malloc ( n * sizeof ( int ) );
}
quindi per deallocarla:
if(mat!=NULL)
{
for ( r = 0; r < 2; r++ )
{
free(mat+r);
}
free(mat);
}
giusto?e un modo per verificare se l'ho deallocata?
si è giusto; prima allochi un vettore per le righe, poi per ogni riga allochi un vettore per la colonna.
la deallocazione è giusta.. solo una cosa: perchè usi la notazione con i cast? non che sia errato ma trattandosi di una matrice, quindi accessibile tramite indici, non ti viene più comodo usare una cosa del tipo:
//allocazione
matrice=(int**)malloc(2*sizeof(int*));
for(i=0;i<2;i++)
matrice[i] = (int*)malloc(n*sizeof(int));
//deallocazione
for(i=0;i<2:i++)
free(matrice[i]);
free(matrice)
ovviamente per accedere agli elementi userai matrice[i][j].
ps: se vuoi ottimizzare un minimo il codice evita il for se hai solo 2 righe.. puoi fare direttamente:
matrice[0]= malloc....
matrice[1]= malloc..
in questo modo eviti l'inizializzazione del contatore, il test su di esso e il suo incremento
:cool: |
willyrs |
Ragazzi, ma come l'avete fatto mosse(k)? Io ho fatto un grafo orientato e non pesato, e sia Prim che Dijkstra richiedono il peso... |
francescoo |
@ste182:
mi sta venendo un dubbio:
io ho fatto piu o meno come avevi detti tu alla pagina 6..intendo per trovare tutte le possibili configurazioni..
il mio grafo pero alla fine è una lista contenente tutte le configurazioni, ed è come se avessi fatto una visita per ampiezza.
pero non sono liste di adiacenza è un unica lista che ha tutte le configurazioni quindi ad es se io parto da 0[3]0[5] la mia lista sarà composta cosi:
0[3]0[5] ->3[3]0[5]->0[3]5[5]->3[3]5[5]->0[3]3[5]->...
in ogni campo della lista oltre alla matrice con la configurazione relative ci sono due campi int num e int padre quindi poi cosi riesco a trovare secondo le varie richieste anche di stampare il cammino ecc..
funziona tutto perfettamente..
pero secondo te è accettabile?questo puo definirsi come grafo? |
ste182 |
Originally posted by francescoo
@ste182:
mi sta venendo un dubbio:
io ho fatto piu o meno come avevi detti tu alla pagina 6..intendo per trovare tutte le possibili configurazioni..
il mio grafo pero alla fine è una lista contenente tutte le configurazioni, ed è come se avessi fatto una visita per ampiezza.
pero non sono liste di adiacenza è un unica lista che ha tutte le configurazioni quindi ad es se io parto da 0[3]0[5] la mia lista sarà composta cosi:
0[3]0[5] ->3[3]0[5]->0[3]5[5]->3[3]5[5]->0[3]3[5]->...
in ogni campo della lista oltre alla matrice con la configurazione relative ci sono due campi int num e int padre quindi poi cosi riesco a trovare secondo le varie richieste anche di stampare il cammino ecc..
funziona tutto perfettamente..
pero secondo te è accettabile?questo puo definirsi come grafo?
sinceramente non so dirti se si può considerare un grafo in quel modo.. però credo di no perchè un grafo per definizione è un insieme di vertici collegati fra loro con archi.
mettendo tutto su un unica lista è un pò come se dicessi che il primo nodo è adiacente direttamente a tutti gli altri.. però potrebbe anche andare bene eh.. non saprei.. |
ste182 |
Originally posted by willyrs
Ragazzi, ma come l'avete fatto mosse(k)? Io ho fatto un grafo orientato e non pesato, e sia Prim che Dijkstra richiedono il peso...
orientato? quindi duplichi i nodi contenenti configurazioni uguali?
in quanto ai pesi non servono, ogni arco ha peso 1, quindi il cammino minimo si trova con una visita in ampiezza che ti genera il sottografo dei cammini |
willyrs |
Originally posted by ste182
orientato? quindi duplichi i nodi contenenti configurazioni uguali?
in quanto ai pesi non servono, ogni arco ha peso 1, quindi il cammino minimo si trova con una visita in ampiezza che ti genera il sottografo dei cammini
No, non duplico. Metti che sono nella configurazione A e facendo un'operazione ottengo la B. Se la B non c'è già nel grafo la aggiungo aggiungendo anche l'arco da A a B, invece se c'è già aggiungo solo quest'ultimo.
Quindi risolvo la cosa creando l'albero di copertura con la visita? |
francescoo |
Originally posted by ste182
sinceramente non so dirti se si può considerare un grafo in quel modo.. però credo di no perchè un grafo per definizione è un insieme di vertici collegati fra loro con archi.
mettendo tutto su un unica lista è un pò come se dicessi che il primo nodo è adiacente direttamente a tutti gli altri.. però potrebbe anche andare bene eh.. non saprei..
quindi dici di implementarlo tramite liste di adiacenza?
o come?
perchè come l'ho fatto io è una lista concatenata effettivamente..
e non riesco a capire ad es come l'ho fatta io il costo quale sarebbe?
n perchè nel caso peggiore la devo scorrere tutta? |
ste182 |
Originally posted by francescoo
quindi dici di implementarlo tramite liste di adiacenza?
o come?
perchè come l'ho fatto io è una lista concatenata effettivamente..
e non riesco a capire ad es come l'ho fatta io il costo quale sarebbe?
n perchè nel caso peggiore la devo scorrere tutta?
bè il costo dipende dalle operazioni che ci fai e da come le fai.. ad esempio se devi fare una visita di tutti i nodi, le prestazioni saranno uguali sia su liste, che grafi che alberi.. perchè devi in ogni caso scorrere tutti i nodi.. se invece devi fare ricerche, allora una lista è lenta nel caso peggiore |
asterix07 |
Torno un attimo sull argomento configurazioni.
Ho la configurazione di partenza memorizzata in una lista bidirezionale:
struct intlist {
struct contenitore c;
struct intlist *next, *prev;
};
(La struttura contenitore è formata da 3 campi int ovvero ID,stato,capacita);
Ora qualcuno mi puo spiegare come posso generare tutte le possibili configurazioni? |
BeppeGoal |
Ragazzi, vi posto i miei dubbi notturni...
1) Comando configurazione: ho trovato un modo per trovare le 16 combinazioni possibili con 2 contenitori. L'ordine di estrazione è importante? C'è un ordine fisso in cui se li aspetta il prof?
2) nel 1' esempio a pag. 7, quando fa il comando "c 2", non mi tornano la riga 7, 9 e 10. In questo caso partendo da una situazione in cui tutti i contenitori sono pieni, come possono uscire i punti precedenti?
3) nell'istruzione "esiste" ho provato a generare tutte le possibili combinazioni partendo da 2 contenitori, ne ho trovate 16. Con n vasi quante se ne possono trovare? Pensavo, nel caso di 2 contenitori, a 2^2^2, ma mi sembra proprio un azzardo, c'è una regola per capire quante combinazioni è possibile estrarre da n contenitori? |
ste182 |
Originally posted by asterix07
Torno un attimo sull argomento configurazioni.
Ho la configurazione di partenza memorizzata in una lista bidirezionale:
struct intlist {
struct contenitore c;
struct intlist *next, *prev;
};
(La struttura contenitore è formata da 3 campi int ovvero ID,stato,capacita);
Ora qualcuno mi puo spiegare come posso generare tutte le possibili configurazioni?
fai una copia della configurazione iniziale
esegui: riempi sulla copia-> se è stato riempito crei un nuovo nodo , altrimenti non fai nulla
ripristini la config iniziale e ripeti il primo passo(finchè hai provato con tutti i contenitori)
fai la stessa cosa per svuota e travasa |
ste182 |
Originally posted by BeppeGoal
Ragazzi, vi posto i miei dubbi notturni...
1) Comando configurazione: ho trovato un modo per trovare le 16 combinazioni possibili con 2 contenitori. L'ordine di estrazione è importante? C'è un ordine fisso in cui se li aspetta il prof?
2) nel 1' esempio a pag. 7, quando fa il comando "c 2", non mi tornano la riga 7, 9 e 10. In questo caso partendo da una situazione in cui tutti i contenitori sono pieni, come possono uscire i punti precedenti?
3) nell'istruzione "esiste" ho provato a generare tutte le possibili combinazioni partendo da 2 contenitori, ne ho trovate 16. Con n vasi quante se ne possono trovare? Pensavo, nel caso di 2 contenitori, a 2^2^2, ma mi sembra proprio un azzardo, c'è una regola per capire quante combinazioni è possibile estrarre da n contenitori?
1) l'ordine non credo sia importante..
2) riga 7= 0[0] 2[3] 6[6]
punto di partenza= 2[2] 3[3] 6[6] voglio stampare tutte le config raggiungibili in 2 passi
passo 1 --> svuoto il bidone 2 e mi trovo in 2[2] 0[3] 6[6]
passo 2 --> travaso 1 in 2 e mi trovo con 0[0] 2[3] 6[6] ovvero la riga 7...:D
per trovare i precedenti, dipende come hai implementato tutto.. io ad esempio genero tutte le combinazioni e le inserisco nelle liste di adiacenza del nodo padre. così facendo mi basta eseguire visite in ampiezza e profondità oppurtunamente modificate per fare le varie funzioni.
3) a questa domanda non ti so rispondere perchè è un quesito di calcolo combinatorio(e ancora quell'esame non l'ho preparato:()
potrebbe essere come dici tu, ovvero numero_bidoni^numero operazioni ma non vorrei dire cazzate, in calcolo faccio pena :D |
asterix07 |
@ste182
Quando nel punto 1 dici "se è stato riempito crei un nuovo nodo": il nuovo nodo lo aggiungo alla lista duplicata oppure ad una nuova lista apposita? |
ste182 |
Originally posted by asterix07
@ste182
Quando nel punto 1 dici "se è stato riempito crei un nuovo nodo": il nuovo nodo lo aggiungo alla lista duplicata oppure ad una nuova lista apposita?
dipende da come implementi le cose; se fai un grafo allora i nodi generati finiranno nella lista o nella matrice di adiacenza e poi uno alla volta finiranno anche nella lista o nel vettore di vertici.
Se fai un albero allora il nodo generato sarà il figlio di quello di partenza.. ecc.. |
technorebel |
Ragazzi, ok il technorebel e' riuscito a farlo girare tutto e sembra funzionare senza strani segmentation fault :))))), adesso mi chiedo....c'e' qualcuno che puo' dirmi come si stima in tempo di calcolo e costi da mettergli nella relazione!?!....adoro i grafi..pero'...:!!!!! |
loreste |
Ciao ragazzi, sto implementando il progetto, ho messo i vasi in una lista, ogni indice della lista è un record con i seguenti dati
Dimensione attuale
Dimensione massima
ora mi chiedo
1) con n vasi quante combinazioni ci sono di operazioni elementari? Come si calcola?
2) sapendo che con 2 vasi ci sono 16 combinazioni, salvo queste combinazioni in una seconda struttura, non capisco perchè voi parlate di grafi, se si implementa un grafo con le liste di adiacenza, metto nella lista le 16 combinazioni, e gli indici di queta lista a cosa puntano? |
technorebel |
@Loreste vedo che sei di Bg pure Te! :) io ho realizzato un grafo, dalla matrice di tutte le combinazioni tolgo quelle che nn sono possibili, trovando i nodi del grafo, poi passi alla lista di adiacenza (vedi cormen), da li realizzi i puntatori ai nodi successivi tramite le operazioni elementari.
PS: qualcuno sulle stime di tempi di calcolo!!!?? :) |
loreste |
Scusa ma non ho capito, mi spieghi come calcoli le combinazioni?
Inoltre, se ho i vasi 3 e 5, creo la seguente lista
(0[3],5[5]);
(3[3],2[5]);
(0[3],2[5]);
(2[3],0[5]);
(2[3],5[5]);
(3[3],4[5]);
....................
....................
Creata questa lista, cosa si mette nelle liste di adiacenza? |
asterix07 |
Ragazzi io ho le seguenti strutture:
struct contnitore{
int id;
in stato;
int capacita;
}
poi ho una lista bidirezionale di contenitori che memorizza la configurazione di partenza
struct intlist {
struct contenitore c;
struct intlist *next, *prev;
};
(per intenderci intlist contiene ad es 0[3]0[5]).
Ora qualcuno è in grado di descrivermi come devo fare la struttura per memorizzare le configurazioni possibili, man mano che vengano create(grafo o lista che sia).....Grazie in anticipo |
loreste |
@asterix07 tu hai la mia stessa struttura, ma guarda che intlist hai un vaso per indice, per interderci NON hai0[3]0[5] ma hai una lista fatta cosi 0[3] -> 0[5] -> nil
Detto questo hai il mio stesso problema, come si calcola le combinazioni? Si sa che con 2 vasi hai 16 combinazioni, ma con 3?
Infine io pensavo di fare una lista con le combinazioni fatta cosi
(0[3],5[5]);
(3[3],2[5]);
(0[3],2[5]);
(2[3],0[5]);
(2[3],5[5]);
(3[3],4[5]);
................
ma qui tutti parlano di grafo, e non capisco cosa mettono nelle liste di adiacenza.... |
ste182 |
nella lista di adiacenza ci vanno tutti nodi che sono raggiungibili dal nodo di partenza eseguendo tutte e 3 le operazioni elementari.
vi posto il grafo con le liste come l'ho implementato:
code:
nodi lista adiacenze
(0[3],0[5]) (3[3],0[5]) (0[3],5[5])
(3[3],0[5]) (3[3],5[5]) (0[3],0[5]) (0[3],3[5])
(0[3],5[5]) (3[3],5[5]) (0[3],0[5]) (3[3],2[5])
(3[3],5[5]) (0[3],5[5]) (3[3],0[5])
(0[3],3[5]) (3[3],3[5]) (0[3],5[5]) (0[3],0[5]) (3[3],0[5])
(3[3],2[5]) (3[3],5[5]) (0[3],2[5]) (3[3],0[5]) (0[3],5[5])
(3[3],3[5]) (3[3],5[5]) (0[3],3[5]) (3[3],0[5]) (1[3],5[5])
(0[3],2[5]) (3[3],2[5]) (0[3],5[5]) (0[3],0[5]) (2[3],0[5])
(1[3],5[5]) (3[3],5[5]) (0[3],5[5]) (1[3],0[5]) (3[3],3[5])
(2[3],0[5]) (3[3],0[5]) (2[3],5[5]) (0[3],0[5]) (0[3],2[5])
(1[3],0[5]) (3[3],0[5]) (1[3],5[5]) (0[3],0[5]) (0[3],1[5])
(2[3],5[5]) (3[3],5[5]) (0[3],5[5]) (2[3],0[5]) (3[3],4[5])
(0[3],1[5]) (3[3],1[5]) (0[3],5[5]) (0[3],0[5]) (1[3],0[5])
(3[3],4[5]) (3[3],5[5]) (0[3],4[5]) (3[3],0[5]) (2[3],5[5])
(3[3],1[5]) (3[3],5[5]) (0[3],1[5]) (3[3],0[5]) (0[3],4[5])
(0[3],4[5]) (3[3],4[5]) (0[3],5[5]) (0[3],0[5]) (3[3],1[5])
la prima colonna indica tutti i vertici del grafo, la seconda indica gli archi(le adiacenze) tra il nodo della prima colonna e i nodi della lista stessa.
ps:occhio a non generare duplicati; mettete i puntatori ai nodi nelle liste anzichè duplicare ogni nodo |
-Oblivion- |
Si sa qualcosa dell'orale? |
loreste |
#ste82 potresti spiegarmi come fai i seguenti passi della lista?
(0[3],0[5]) situazione inizile questo è chiaro
(3[3],0[5]) R1 prima operazione elementare
(0[3],5[5]) qua esegui S1 e R2??? sono 2 operazioni
(3[3],5[5]) qua esegui R1
non capisco se partendo da (0[3],0[5]) il successivo deve essere l'aggiunta di una sola operazione elementare, quindi non mi è chiaro come da (3[3],0[5]) arrivi a (0[3],5[5]) con una sola operazione elementare |
ste182 |
Originally posted by loreste
#ste82 potresti spiegarmi come fai i seguenti passi della lista?
(0[3],0[5]) situazione inizile questo è chiaro
(3[3],0[5]) R1 prima operazione elementare
(0[3],5[5]) qua esegui S1 e R2??? sono 2 operazioni
(3[3],5[5]) qua esegui R1
non capisco se partendo da (0[3],0[5]) il successivo deve essere l'aggiunta di una sola operazione elementare, quindi non mi è chiaro come da (3[3],0[5]) arrivi a (0[3],5[5]) con una sola operazione elementare
la prima colonna elenca i vertici di tutto il grafo; non è posibile passare da 3[3] 0[5] a 0[3] 5[5] con una sola operazione.
le operazioni sono elencate nella seconda colonna, quindi:
da 3[3] 0[5] puoi passare a (3[3],5[5]) (0[3],0[5]) (0[3],3[5]) |
asterix07 |
@loreste:
Ma tu quindi continui con la stessa struttura (lista adiacenza) o la cambi con i vettori? |
loreste |
ok, ho capito, cmq procedo con le liste di adiacenza. Grazie a tutti |
BeppeGoal |
Scusate, voi come fate a leggere n valori in input nell'esecuzione di una funzione?
Ad esempio nell'esecuzione del comando "configurazione",
se devo leggere 2 valori potrei usare scanf("%d%d",&n1,n2), ma per più valori? |
technorebel |
raga, ma l'orale di Aguzzoli come e'? cioe' il progetto ok, ma ti chiede la righina in particolare?!! sinceramente dopo 1047 righe ultra commentate nn vorrei che ti andasse a chiedere il pelo nell'uovo?!!!
ricordarmi cio' che ho scritto nelle vacanze di Natale....nzommmma :))
...spero nn sia un'interrogazione sul C....e' uno strumento utile per risolvere un problema, pero' chi se le ricorda ora le dispense!"!! |
f3d386 |
ragazzi qualcuno sa spiegarmi con che idea è riuscito ad implementare la funzione configurazioni(d) ?
grazie |
palaz |
ma va l'orale di aguzzoli è una vaccata.. devi spiegargli che strutture hai usato.. perche le hai usate, e se ci sono metodi per poter fare meglio...ma tutto con la teoria...la parte difficile è quella di torelli... |
technorebel |
grazie Palaz!! allora sotto con la teoria!!! :) e speriamo di passare l'esamone!! dopo 1 mese di progetto!! |
f3d386 |
ragazzi una domanda...
ma se io dichiaro pericolosa una configurazione, ho capito che non deve più essere utilizzata in operazioni come contenenti o mosse...ma se dovessi raggiungerla con le operazioni elementari R S e T ?
ad esempio:
mettiamo che abbia questa situazione iniziale: 0[3] 0[5]
dichiaro pericolosa 3[3] 5[5] con:
>p 3 5
se poi faccio
>R 1
>R 2
va bene o dovrebbe stamparmi qualcosa per avvertirmi che sono in una configurazione pericolosa? |
asterix07 |
DA quanto ho capito io dovrebbe dichiararla pericolosa e non farla eseguire |
f3d386 |
quindi dovrebbe stamparmi "operazione pericolosa" e non eseguirla giusto?
grazie mille! |
asterix07 |
Io l'ho interpretata cosi...prego |
francescoo |
ciao a tutti,
finalmente ho superato algoritmi :D:D:D:D:D:D
volevo ringraziare tutti e per chi ancora lo deve sostenere vi dico che l'orale non è per niente difficile anzi..
il prof.Torelli è molto disponibile e ti fa ragionare..
in bocca al lupo..(crepi..)
ciauu |
technorebel |
mi associo! un bel 24 intascato!! attenti a non sottovalutare il progetto, se lo avete fatto bene, cmq ricordatevi come funzionano precisamente tutte le strutture dati! e perche' le avete scelte, Aguzzoli s vuoli scende nei dettagli delle singole implementazioni, Torelli e' un docente magnifico! non lasciate cmq capitoli a zero, almeno una lettura fatela. Poi se nn ci arrivate, Lui e' disponibilissimo a farvi ragionare e se nn sapete a capire, e' importante e difficile questo esame.
In bocca al lupo a tutti!! adesso statistica e poi tesi!! |
asterix07 |
Come fareste la funzione mosse(k) avendo tutte le configurazioni salvate in un albero binario? |
andrekiba |
ciao, fai una BFS (ricerca in ampiezza) a partire dalla sorgente e ogni volta che scopri un nuovo nodo salva da qualche parte il nodo che l'ha scoperto per primo...in poche parole definisci il padre. Alla fine della bfs trovi la configurazione di livello k ideale e tramite una semplice funzione ricorsiva stampi i padri...di fatto la sequenza più corta di nodi che ha portato a scoprirla. |
BeppeGoal |
Scusate, qualcuno che ha passato l'esame del progetto Die Hard, potrebbe postarlo nell'area filez?
Grazie a tutti! |
|
|
|
|