Esercizio 1 Si scriva un programma C che realizza l'assegnazione ottima di un insieme di persone ad un insieme di città avente la stessa cardinalità. Ogni persona ha espresso una serie di preferenze, elencando in ordine di preferenza decrescente le città disponibili. Il programma trova l'assegnazione che rispetta nel modo complessivamente migliore le preferenze espresse. Si supponga che il numero di persone (e di città) sia pari a 10. Il programma esegue le seguenti operazioni: Legga da tastiera le preferenze di ogni persona, sotto forma di 10 righe, ciascuna composta da 10 interi. Il primo numero sulla riga i-esima rappresenta l'indice della città più "desiderata" dalla persona i-esima, l'ultimo l'indice della città meno desiderata. Calcola l'abbinamento ottimale, ossia quello che massimizza la funzione A = Σ f(i), dove f(i) è una funzione che per la persona i-esima vale 10 se la persona è stata assegnata alla città più desiderata, 9 se è stata assegnata alla città corrispondente alla seconda scelta, e così via, sino al caso in cui la persona è assegnata alla città meno desiderata (1). La sommatoria è estesa a tutte le 10 persone. Nel caso ottimo (non sempre possibile) la funzione A assume il valore 100. Visualizza l'abbinamento ottimo, stampando su video le 10 coppie di numeri (identificativo della persona, identificativo della città) che risultano dall'abbinamento. Supponendo per semplicità che il numero di persone (e di città) coinvolte sia 3 (e non 10), si ipotizzi che il programma legga le seguenti 3 righe 1 2 3 1 3 2 2 3 1 L'abbinamento ottimale è persona 1 nella città 1, persona 2 nella città 3, perswona 3 nella città 2. Per tale abbinamento la funzione A assume il valore 8). Il programma visualizza quindi 1 1 2 3 3 2 Esercizio 2 Si scriva un programma C che determini quali monete devono essere rilasciate da una macchina per il caffè per restituire una cifra prefissata. Il programma riceve come ingresso da tastiera La cifra totale che la macchina deve rilasciare, compresa tra 50 e 1000 Le monete disponibili, nei tagli da 5, 10, 25, 50, 100, ciascuno nel formato <Valore> <numero_monete_disponibili> 1
Il programma produce su video la soluzione, corrispondente ad una serie di righe con il formato <valore> <numero_monete> Si faccia in modo che il programma calcoli e visualizzi la soluzione ottima, corrispondente al numero minimo di monete. Il programma acquisisce da tastiera 85 5 8 10 13 25 7 50 10 100 0 Il programma produce come soluzione ottima 10 1 25 3 Esercizio 3 Si scriva un programma C che gestisca la ripartizione di un insieme di oggetti tra un gruppo di bidoni. un file contiene la descrizione degli oggetti, ciascuno dei quali è identificato da un nome (una stringa senza spazi) e da un peso (numero intero tra 1 e 1000). Gli oggetti sono elencati uno per riga, mentre la prima riga del file contiene il numero totale di oggetti. il programma riceve da tastiera un numero intero che indica la portata di ciascun bidone. Il programma deve stampare su video una possibile disposizione degli oggetti nei bidoni, facendo sì che tutti gli oggetti vengano considerati, e che il peso complessivo degli oggetti in ciascun bidone non superi la relativa portata. L output su video deve essere simile al seguente: Il bidone n. 1 contiene: martello (peso 1), incudine (peso 100) Il bidone n. 2 contiene: staffa (peso 10), alabarda (peso 50) ecc ecc Si faccia in modo che il programma calcoli e stampi la disposizione ottima degli oggetti nei bidoni, ossia la disposizione che, rispettando i vincoli già citati, utilizzi il minimo numero di bidoni. 2
Esercizio 4 Si scriva un programma C che risolva il problema del quadrato magico. Un quadrato magico di dimensione N è una matrice in cui sono presenti tutti e soli i numeri tra 1 e N 2, disposti in modo tale che la somma dei valori su tutte le righe è costante, ed è pari alla somma dei valori su tutte le colonne. Il programma legge da tastiera il numero N (compreso tra 3 e 10), trova un quadrato magico di dimensione N e lo visualizza. Il seguente è un quadrato magico di dimensione 3: 8 3 4 1 5 9 6 7 2 Esercizio 5 Si scriva un programma C che permetta dimuoversi all'interno di un labirinto. Il labirinto è composto da N stanze, ognuna delle quali ha al più 4 porte che la mettono in comunicazione ciascuna con un'altra stanza (o con l'esterno). Si assume che il mondo esterno (porte di entrata/uscita) corrisponda alla stanza 0. Il programma: Legge da un file (il cui nome viene specificato da tastiera) la descrizione del labirinto. Nella prima riga è scritto il numero N. Nelle N righe successive vi sono gli indici delle 4 stanze raggiungibili da ciascuna delle 4 porte della stanza. Se una porta è chiusa compare il valore 1. Acquisisce da tastiera l'indice della stanza da cui partire. Trova una sequenza di mosse che porta dalla stanza iniziale all uscita. Visualizza la sequenza di mosse. Per ogni mossa si visualizza il numero della stanza raggiunta. Per la descrizione interna del labirinto si utilizzi una struttura a matrice di adiacenza. Si assuma che il file di input abbia il seguente contenuto 6 0 2 1 1 1 3 4 1 2 4 5 1 5 6 2 3 6 4 3 1 0 4 5-1 corrispondente al labirinto della figura seguente. Si riporta di seguito una possibile sequenza di mosse, che parte dalla stanza 4 (il cui indice è stato acquisito da tastiera): 4 3
3 2 1 USCITA 6 5 4 3 2 1 Esercizio 6 Ad una cena vengono invitate n persone, che prendono posto ad un tavolo rotondo. Tra alcune di queste persone esistono rapporti di antipatia, ed il padrone di casa desidera trovare una sistemazione degli invitati attorno al tavolo tale per cui nessuno di essi si trovi vicino ad una persona a lui antipatica. Si scriva un programma C che esegua le seguenti operazioni: legga da un file (il cui nome deve venire acquisito da tastiera) l elenco delle coppie di persone tra cui esistono rapporti di antipatia; ciascuna persona è identificata da un numero; il file contiene nella prima riga il numero di persone invitate alla cena, ed in ciascuna delle righe successive i numeri corrispondenti a due persone tra le quali esiste un rapporto di antipatia; determini una possibile disposizione degli invitati attorno al tavolo, tale per cui nessuno sia vicino a persone con cui ha un rapporto di antipatia; visualizzi tale disposizione. Si consiglia di rappresentare internamente le relazioni di antipatia tra le persone tramite un grafo. Esercizio 7 Realizzare un programma per l analisi di grafi di dimensione arbitraria. Il programma deve leggere da file la descrizione di un grafo, il cui nome viene acquisito da tastiera, e fornire le seguenti informazioni: 4
Numero nodi e numero archi (totale) Densità totale (totale) Numero componenti connesse. Quindi, per ogni componente connessa: o Se la componente connessa è ciclica o Numero nodi e numero archi o Densità Il formato del file è il seguente: La prima linea contiene il numero dei vertici n Ciascuno dei successivi n blocchi di righe contiene (un informazione per riga): o Una riga contenente i caratteri *k dove k è il numero del vertice cui si riferisce il blocco o Il numero dei vertici adiacenti al vertice k o La lista dei vertici adiacenti Esercizio 8 Realizzare un programma per risolvere il problema del commesso viaggiatore (TSP). Il programma deve leggere da file un elenco di città nel formato: numero_città Città_1 latitudine longitudine Città_2 latitudine longitudine Città_3 latitudine longitudine Città_4 latitudine longitudine e calcolare il più breve ciclo hamiltoniano partendo dalla prima città. Al termine dell esecuzione, deve visualizzare i nomi delle città nel ciclo ed il costo totale. Il nome del file è passato come primo argomento sulla linea di comando, oppure acquisito da tastiera. Osservazioni: Il problema è un calcolo del TSP su di un grafo completo, non ordinato e pesato. I pesi degli archi corrispondono alla distanza fra i vertici. I nomi delle città non contengono spazi. Latitudine e longitudine sono interi, ma la distanza è di tipo double. : % tsp2 tsp2-11-real.dat 00) Torino 01) Genova 02) Firenze 03) Roma 04) Napoli 05) Palermo 06) Catania 5
07) Bari 08) Venezia 09) Bologna 10) Milamo 11) Torino Weight: 2883.43 Esercizio 9 Realizzare un programma per calcolare cicli su grafi orientati, pesati, non completi. Il programma deve leggere da file la descrizione di un grafo, il cui nome è passato come primo argomento sulla linea di comando, e, dati due vertici v 1 e v 2, calcolare il ciclo di peso minimo che li includa entrambi. (suggerimento: cercare il percorso di peso minimo che parte da v 1, arriva a v 2 e ritorna a v 1, senza passare due volte dallo stesso nodo). Il formato del file è quello utilizzato per l esercitazione 7: La prima linea contiene il numero dei vertici n Ciascuno dei successivi n blocchi di righe contiene (un informazione per riga): o Una riga contenente i caratteri *k dove k è il numero del vertice cui si riferisce il blocco o Il numero dei vertici adiacenti al vertice k o La lista dei vertici adiacenti ed il peso dell arco corrispondente : Nel grafo descritto nel file tsp-200-50.dat, il ciclo di peso minimo che contiene il vertice 0 ed il vertice 1 è: 0 22 78 73 142 1 0 6