PDA

View Full Version : [C] progetto su skyline


matteo.pata
10-09-2010, 18:07
Ciao ragazzi rieccomi qua ad esporvi le mie problematiche:
ho un progetto da fare: mi servirebbe una mano per scegliere la giusta struttura dati da utilizzare e per mettere giù qualche pezzo di codice:
il testo è:
New New New York è la città più popolata nell'anno 3500 D.C. (costruita sulle ceneri di New New
York). A NNNY si costruiscono grattacieli quasi ogni giorno. I grattacieli non sono fatti per durare in
eterno. Già al momento della costruzione è nota la data della demolizione, talvolta vicinissima a quella
di costruzione.
Ogni grattacielo al momento della costruzione viene battezzato con un nome (univoco). Qualche volta,
si decide di ristrutturare un grattacielo già esistente e si proroga la data della sua demolizione.
New New New York si a accia sul mare: la sua spiaggia si estende da Nord a Sud. Se la si osserva dal
mare, di notte, sopra alla spiaggia appare un tipico skyline (la linea di con ne fra cielo e grattacieli).
Infatti, ogni metro di spiaggia (ad una certa latitudine) è sovrastato da un certo numero di grattacieli a
longitudini diverse (talvolta uno o nessuno). Chiaramente, è sempre il più alto di questi a svettare sugli
altri, e la sua altezza de nisce l'altezza dello skyline su quel metro di spiaggia. In assenza di palazzi, lo
skyline è alto zero.
Il problema consiste nel registrare, un certo numero di volte durante la serie di costruzioni e abbattimenti,
quante altre volte lo skyline si è presentato esattamente nella stessa forma in passato (per ni turistici e
storici).
Dati in input
L'input consiste in una serie di righe. Nella prima riga compare un numero, che corrisponde alla lunghezza totale della spiaggia in metri (per esempio, se vale 5, la spiaggia comincia nel punto 0 e si estende no al punto 5).
Ciascuna riga successiva descrive un evento quotidiano, oppure una query. Ogni giorno avviene soltanto un evento. Un evento può corrispondere alla costruzione di un nuovo palazzo, oppure alla ristrutturazione di un palazzo già esistente (con conseguente procrastinamento della sua demolizione), oppure ancora al semplice passaggio di una giornata (evento vuoto). Costruzioni e ristrutturazioni avvengono sempre nel primo mattino. La sera, quando è necessario, uno (o anche più) palazzi (arrivati alla ne della loro vita) possono essere abbattuti. Se nella riga successiva all'evento compare una query, allora il programma deve rispondere ad una domanda relativa alla notte successiva all'ultimo evento trascorso.
E' Le righe che descrivono una query consistono nel solo carattere \punto interrogativo". Nel leggere questa riga, il programma dovrà stampare a schermo il numero di notti precedenti nelle quasi lo skyline si è presentato identico a quello della notte corrente . Ad esempio, se durante la notte relativa alla richiesta siamo in presenza di uno skyline inedito, si dovrà stampare il numero 0. Se lo skyline è identico a quello della notte di una settimana prima (ma diverso da quello di tutte le altre notti) si dovrà stampare il numero 1.

Gli eventi di tipo costruzione cominciano con la stringa \new" (senza le virgolette), seguita dal nome del palazzo costruito, seguito da una tripletta di misure del grattacielo, seguito dalla durata prevista, cioè dal numero di giorni che il grattacielo deve durare prima di essere abbattuto. Le tre misure rappresentano, rispettivamente: da quale metro di spiaggia comincia e a quale metro fi nisce
il grattacielo, e la sua altezza, in centimetri. Si tratta di tre numeri naturali. Ad esempio, se compaiono i numeri 4 6 1000, signi ca che il grattacielo si estende nell'intervallo che comincia a 4 metri esatti, nisce al sesto metro (sarà dunque lungo due metri), ed è alto 1000 centimetri (10 metri). La durata è espressa in giorni, ed e' un numero naturale strettamente maggiore di 0 che rappresenta il numero di giornate che devono trascorrere prima dell'abbattimento (salvo rimandi). Il grattacielo viene abbattuto la sera della sua ultima giornata, prima della notte successiva. Quindi, ad esempio, se la durata valesse 1, il grattacielo verrebbe abbattuto ancor prima della notte successiva.

Gli eventi di tipo ristrutturazione cominciano con la stringa \renew" (senza le virgolette), seguita dal nome del palazzo in questione, seguito dal numero di giorni di durata ulteriore da attribuire al grattacielo.

Gli eventi vuoti consistono nella lettera \v" (senza le virgolette).
La serie di righe è terminata da una riga composta da un solo punto esclamativo, che segnala la ne del
problema.


L'input viene fornito al programma sotto forma di fi le di testo, il cui nome viene speci cato dal primo
argomento passato al programma. Se non ne viene speci cato alcuno, l'input deve venir letto direttamente dallo stdin.
Dopo la lettura di un evento, il programma deve stampare un numero Alla ne della giornata a cui l'evento fa riferimento.


Facciamo ad esempio il seguente caso di le di input.
15
new aaa 7 10 2500 3
new bbb 5 10 1500 100
?
new ccc 7 9 2500 100
new ddd 9 10 2500 100
?
!
2


Il primo giorno viene costruito aaa, e il secondo bbb.
Al momento della la prima query, la seconda notte, saranno presenti entrambi i grattacieli aaa e bbb. Dal metro 7 al metro 10 (dunque per tre metri) avremo uno skyline alto esattamente 25 metri (l'altezza del palazzo aaa). Dal metro 5 al 7, alto 15 (per il palazzo bbb, che in e etti prosegue anche no al metro 10,
ma dal metro 7 al 10 la sua silhouette viene coperta da quella di aaa). Visto che questa con gurazione non ha avuto precedenti, alla query si risponderà con uno 0.
La mattina del terzo giorno viene costruito ccc. Alla sera dello stesso giorno, aaa viene abbattuto. Il quarto giorno viene costruito ddd. Al momento della seconda query, cioe la quarta notte, lo skyline è lo stesso della seconda notte (pur essendo in piedi un numero diverso di palazzi). Dunque alla query si
risponderà con un 1.
So noti che e' alla seconda query si sarebbe dovuto rispondere nello stesso modo anche se la prima query non fosse stata e ettuata. Infatti, conta il numero di notti, indipendentemente dal numero di queries.



Grazie in anticipo a tutti quelli che mi daranno una mano....

tuccio`
10-09-2010, 19:37
non so se qualcuno ti darà una mano, è molto più facile che la gente faccia come me: scrolli il mattone e posti un commento inutile ^_^

matteo.pata
12-09-2010, 18:57
up dai ragazzi una mano per favore :help:

lupoxxx87
13-09-2010, 10:14
è uguale a quello che avevi postato, e ti avevamo già detto come risolvere, tempo fa

matteo.pata
13-09-2010, 20:44
hai ragione infatti lo avevo risolto però questo è un po' diverso e sopratutto la'ltra volta il prof mi aveva fatto storie per la strutttura dati utilizzata infatti mi avevo dato 18.Per quello ho ripostato il nuovo progetto simile per poter vedere di darmi una mano su una nuova struttura dati.

khelidan1980
13-09-2010, 20:56
hai ragione infatti lo avevo risolto però questo è un po' diverso e sopratutto la'ltra volta il prof mi aveva fatto storie per la strutttura dati utilizzata infatti mi avevo dato 18.Per quello ho ripostato il nuovo progetto simile per poter vedere di darmi una mano su una nuova struttura dati.

pensarne una te no? troppo eh?

matteo.pata
13-09-2010, 21:03
ci sto pensando ma non sono troppo ferrato sugli algoritmi e sul C e visto il lavoro e tutto il resto ho chiesto appunto una mano a voi.;)

Darecon
14-09-2010, 14:37
ci sto pensando ma non sono troppo ferrato sugli algoritmi e sul C e visto il lavoro e tutto il resto ho chiesto appunto una mano a voi.;)

Io non lo rifarei, tanto massazza non tiene conto del voto di tarini.. Poi vedi te.. :)

RaouL_BennetH
14-09-2010, 15:16
ci sto pensando ma non sono troppo ferrato sugli algoritmi e sul C e visto il lavoro e tutto il resto ho chiesto appunto una mano a voi.;)

Ciao :) Scusa l'intromissione e, per evitare qualsiasi equivoco, dico già che non è direttamente rivolto a te quanto sto per chiedere:

Ma, mi chiedo e vi chiedo, come è possibile che si debbano sostenere certi esami, se non si conosce neanche la materia per affrontarli ?

Davvero, non capisco :what:

Se non conosco (int questo caso) il "C" , com'è possibile che devo affrontarci addirittura un esame ? :muro: o meglio... che diavolo si studia allora all'università ?!?!?!? :mad:


Chiedo ancora scusa all'autore per l'OT .

Darecon
14-09-2010, 18:26
Ciao :) Scusa l'intromissione e, per evitare qualsiasi equivoco, dico già che non è direttamente rivolto a te quanto sto per chiedere:

Ma, mi chiedo e vi chiedo, come è possibile che si debbano sostenere certi esami, se non si conosce neanche la materia per affrontarli ?

Davvero, non capisco :what:

Se non conosco (int questo caso) il "C" , com'è possibile che devo affrontarci addirittura un esame ? :muro: o meglio... che diavolo si studia allora all'università ?!?!?!? :mad:


Chiedo ancora scusa all'autore per l'OT .
Si studia si studia.. :)
Probabilmente e' lui, che, a quanto ho capito, non seguendo i corsi non ha capito.. :)

matteo.pata
14-09-2010, 19:19
Ciao :) Scusa l'intromissione e, per evitare qualsiasi equivoco, dico già che non è direttamente rivolto a te quanto sto per chiedere:

Ma, mi chiedo e vi chiedo, come è possibile che si debbano sostenere certi esami, se non si conosce neanche la materia per affrontarli ?

Davvero, non capisco :what:

Se non conosco (int questo caso) il "C" , com'è possibile che devo affrontarci addirittura un esame ? :muro: o meglio... che diavolo si studia allora all'università ?!?!?!? :mad:


Chiedo ancora scusa all'autore per l'OT .

diciamo che studiare ho studiato ma per programmare come ben tu sai ci vuole passione e sopratutto bisogna essere portati.
Io ho fatto informatica non per diventare programmatore ma ben si per diventare sistemista.E infatti lavoro in un'azienda come sistemista.
E' vero basta studiare e applicarsi ho già svolto almeno 3 progetti ma purtroppo le mie doti del C non sono proprio affini.Io vi ho chiesto una mano su che struttura dati utilizzare non su tutto il codice.Ho chiesto una mano perchè per me il C risulta difficile anche avendolo studiato per anni.
Quindi non è un problema di studiare fidati torno dal lavoro e mi faccio un C___o quadro pr poter finire l'università visto che mi mancano solo due esami.

Ciao ringrazio tutti per gli aiuti che mi darete....

wingman87
14-09-2010, 20:15
Io terrei un vettore di liste ordinate (per altezza) di grattacieli.
Il vettore conterrà all'indice 0 la lista di grattacieli che iniziano al metro 0, all'indice 1 quelli che iniziano al metro 1 e così via.
In questo modo ricavare lo skyline di un giorno è semplice e veloce (complessità O(n) nel numero di metri).
Ogni sera dovrai scorrere tutte le liste per decrementare i giorni di vita ed eliminare quelli che sono arrivati a zero (quindi complessità O(n) nel numero di grattacieli).
Rinnovare un grattacielo ha la stessa complessità perché devi cercarlo per nome all'interno delle liste.
Aggiungere un grattacielo ha sempre complessità O(n) perché i grattacieli potrebbero iniziare tutti allo stesso metro e quello da inserire potrebbe essere il più basso.

Lo skyline lo calcolerei tutti i giorni e lo metterei da parte insieme a quelli già calcolati, quando è richiesta una query confronti lo skyline del giorno con i precedenti (già calcolati) e quindi nuovamente con complessità O(n).

Tutte queste complessità valgono se utilizzi delle liste semplici, se poi usi delle strutture un po' più sofisticate (come degli heap) si può migliorare.
Inoltre potresti tenere in memoria anche più di una struttura dati per usare quella più adatta all'operazione che devi eseguire (in questo caso devi fare attenzione a mantenere coerenti i dati in tutte le strutture).

Spero di non aver dimenticato nulla.

RaouL_BennetH
15-09-2010, 10:57
[QUOTE=matteo.pata;33087307]

Cut

[\QUOTE]

Non devi spiegarmi ne giustificarti di nulla, almeno con me :D

Ho premesso che non era direttamente rivolto a te ma è che mi capita spesso di leggere 3d di richiesta di soluzione completa(e non è il tuo caso) di un esercizio perchè non si conosce la materia.

Per quanto mi riguarda è diverso tempo che sono confinato ad un livello basso di preparazione e di esperienza perchè, se è vero che di passione ne ho da vendere, non avendo fatto l'università ho delle enormi lacune che difficilmente (idea mia) da autodidatta si riescono a colmare.

Scusami ancora per l'OT :)

matteo.pata
16-09-2010, 00:23
tranquillo non l'ho presa sul personale era solo per chiarire un po' la mia situazione.Diciamo che cmq esperienza personale, Si ti posso dare una mano nel programmare i docenti universitari ma la maggior parte delle cose te le devi vedere per conto tuo.Le basi te le danno per bene e poi sei te che ti devi smazzare il resto.
Cmq rimango sempre in attesa di info sul mio progetto :help:

matteo.pata
18-09-2010, 11:37
UP....please aiutatemi...:help:

wingman87
19-09-2010, 01:19
UP....please aiutatemi...:help:
Veramente io avevo scritto un post 4 giorni fa... in effetti non sono sceso molto nel dettaglio.
Ho pensato che potresti implementare più strutture dati (come accennavo nello scorso post) in modo da coprire più o meno tutte quelle che avete visto durante il corso.

matteo.pata
19-09-2010, 13:34
si il post mi è risultato utile..non so però ancora come tenere traccia dei vari skyline creati...praticamente non so in che struttura dati salvarli,perchè ogni volta che creo o distruggo un grattacielo devo tenere traccia dello skyline.

wingman87
19-09-2010, 15:48
Io lo vedo intuitivamente come una lista di coppie di valori (metro,altezza) in cui per risparmiare spazio si possono eliminare tutte le coppie la cui altezza non cambia rispetto alla coppia precedente. Quindi per determinare se due skyline sono uguali basta confrontare le due liste. Per rendere i confronti ancora più veloci puoi tenere dei codici hash delle liste in modo che se l'hash non corrisponde non perdi tempo a confrontare le liste.

FeDeGbR
22-09-2010, 20:43
è lo stesso progetto che sto facendo anche io =D
ti mando un messaggio privato...