Problema delle 12 monete Esercizi (semplici algoritmi) CORDA – Informatica A. Ferrari ¤ Abbiamo 12 monete che sembrano identiche ma non lo sono. Una di esse ha un peso diverso dalle altre ma non sappiamo qual è e neppure se è più pesante o più leggera delle altre. ¤ Dobbiamo scoprire qual è la moneta di peso diverso, con 3 pesate comparative utilizzando una bilancia a due piatti. Algoritmo delle 12 monete Esercizio 1 ¤ Scrivere un programma che implementa l’algoritmo presentato per risolvere il problema delle 12 monete ¤ Scrivere una seconda versione dell’algoritmo in cui si pesano solamente 2 monete per volta Esercizio 2 Esercizio da Olimpiadi Informatica (Lo struzzo Simone) ¤ Scrivere un programma in linguaggio C che stampi tutte le permutazioni ottenibili combinando le 4 lettere ‘A’, ‘B’, ‘C’, ‘D’. ¤ Lo struzzo Simone si sposta solo nelle direzioni dei quattro assi cardinali (Nord, Sud, Est, Ovest). Ogni suo passo misura 1 metro. Dovete scrivere un programma che, data una sequenza di spostamenti di Simone, misuri quant'è la distanza fra il punto di partenza e il punto di arrivo ¤ Segue un possibile output atteso del programma. ABCD BACD CABD DABC ABDC BADC CADB DACB ACBD BCAD CBAD DBAC ACDB BCDA CBDA DBCA ADBC BDAC CDAB DCAB ADCB BDCA CDBA DCBA ¤ Dati di input ¤ Il file input.txt contiene la sequenza degli spostamenti. Tale file è costituito da un'unica riga di testo, contenente una sequenza di S, N, E, O (che indicano gli spostamenti nelle direzioni Sud, Nord, Est, Ovest rispettivamente). La sequenza è terminata da un *. Ad esempio, il file di input NNESO* dice che Simone si sposta di due metri a Nord, poi di un metro verso Est, poi di un metro verso Sud, e quindi di un metro a Ovest. ¤ Dati di output ¤ Il file output.txt deve contenere un'unica riga. Su questa riga dovrà comparire il numero intero corrispondente al quadrato della distanza. 1 Lo struzzo Simone (2) Input output File input.txt File output.txt #include <stdio.h> NNSEEESNOENNS* 13 NNESOS* 0 OSOS* 4 int main() { FILE *fin = fopen("input.txt", "r"); FILE *fout = fopen("output.txt", "w"); char input[100000]; fscanf(fin, "%s", input); while (input[i] != '*') { Assunzioni • Il numero complessivo di spostamenti contenuti nel file di input è minore o uguale a 100000. • L'esecuzione del programma deve terminare entro 5 secondi. } } fprintf(fout, "%d", ….); fclose(fin); fclose(fout); return 0; Lo struzzo Simone (3) Esercizio da Olimpiadi Informatica (La biblioteca degli smemorati ) #include <stdio.h> ¤ Descrizione del problema int main() { FILE *fin = fopen("input.txt", "r"); FILE *fout = fopen("output.txt", "w"); char input[100000]; int i = 0, ns = 0, eo = 0; fscanf(fin, "%s", input); while (input[i] != '*') { switch (input[i]) { case 'N': ns++; break; case 'S': ns--; break; case 'E': eo++; break; case 'O': eo--; break; } i++; } fprintf(fout, "%d", ns*ns + eo*eo); fclose(fin); fclose(fout); return 0; } ¤ La vostra biblioteca rionale ha qualche problema nello stabilire da quanto tempo gli utenti tengono i libri. Dovete aiutarli scrivendo un programma che, prese in input due date del 2015, stabilisca quanti giorni intercorrono tra le due date. ¤ Dati di input ¤ Il file input.txt è formato da una riga che contiene la data iniziale e la data finale del prestito. Più precisamente, la riga contiene quattro interi: la prima coppia specifica la data iniziale, la seconda la data finale. Ogni data è formata da due numeri, e cioè il giorno del mese e il numero del mese. ¤ Dati di output ¤ Il file output.txt deve contenere un'unica riga. Su questa riga dovrà comparire il numero intero corrispondente ai giorni che intercorrono tra le due date in input. La biblioteca degli smemorati (2) ¤ Assunzioni ¤ La seconda data non precede mai la prima. ¤ Il numero di giorni considerato non comprende quello iniziale: quindi, ad esempio, tra il 2 gennaio e il 2 gennaio intercorrono 0 giorni, tra il 30 gennaio e il 2 febbraio intercorrono tre giorni, e così via. ¤ L'esecuzione del programma deve terminare entro 5 secondi. File input.txt 2 3 2 3 30 1 2 2 1 5 2 7 File output.txt 0 3 62 2