Informatica Generale Homework di Recupero 2016

Documenti analoghi
ESERCIZI SULLA TECNICA BACKTRACKING e BRANCH & BOUND

PROVETTE D ESAME. Algoritmi e Strutture Dati

Esercizi

Macchina di Turing Universale

0.1 Esercizi calcolo combinatorio

INDICE DEI GIOCHI. Giochi del 23 Aprile 2016

Alberi binari e alberi binari di ricerca

Esercitazione 6. Alberi binari di ricerca

Automi a stati finiti

Liste di Liste Matrici

Esercizi su Python. 14 maggio Scrivere una procedura che generi una stringa di 100 interi casuali tra 1 e 1000 e che:

Esercizi di Fondamenti di Informatica per la sicurezza. Stefano Ferrari

alla categoria di automi a minor potenza riconoscitiva possibile. }, dove k è un parametro.

12 Function Handles e Ricorsione in MATLAB

Gara Matematica. Dipartimento di Matematica Ulisse Dini. Viale Morgagni 67/a Firenze. Soluzioni edizione 2011

Algoritmi Greedy. Tecniche Algoritmiche: tecnica greedy (o golosa) Un esempio

Alberi ed Alberi Binari

Lezione 9 Alberi binari di ricerca

Programmazione Greedy I codici di Huffman

Corso di Laurea in Matematica per l Informatica e la Comunicazione Scientifica

Note per la Lezione 4 Ugo Vaccaro

(A) CONOSCENZA TERMINOLOGICA (B) CONOSCENZA E COMPETENZA (C) ESERCIZI DI COMPRENSIONE

Fondamenti teorici e programmazione

Fondamenti d Informatica: Le Macchine di Turing. Barbara Re, Phd

Moltiplicazione. Divisione. Multipli e divisori

ELEMENTI DI PROGRAMMAZIONE a.a. 2013/14 UNA GERARCHIA DI MACCHINE

Albero binario. Alberi binari (introduzione) Terminologia. Alberi di ricerca binaria (BST)

Suffix Trees. Docente: Nicolò Cesa-Bianchi versione 21 settembre 2017

Laboratorio di Python

LABORATORIO DI INFORMATICA ESERCITAZIONE VIII

SUDOKU Come si gioca Regole del Gioco Risolvere un Sudoku Consigli

Alberi. Alberi: definizioni. Alberi Binari. Esercizi su alberi binari: metodi ricorsivi. Struttura dati per alberi generici. ASD-L - Luca Tesei

Informatica II. Capitolo 16 Backtrack

10 Funzioni MATLAB. dove: output1, output2,.. sono gli output (opzionali), che, se dichiarati, devono essere inizializzati dalla funzione

Lezione 9 Alberi binari: visite ed esercizi

Lista di esercizi 11 maggio 2016

Esercizi di Programmazione Prolog

Algoritmi e Principi dell Informatica

Quiz sui linguaggi regolari

n deve essere maggiore di 0, altrimenti il metodo restituisce null.

Frequenza lettere in inglese

Transcript:

Informatica Generale Homework di Recupero 016 docente: Ivano Salvo Sapienza Università di Roma Gruppo 1 Esercizio 1.1 Scrivere un programma C che presi in input due interi positivi a ed b (a, b > 0) calcola il logaritmo intero di a in base b. Più formalmente, il programma deve restituire in output un numero intero k, per cui sia verificata la disuguaglianza b k a < b k+1. Esempi: Presi in input 6 e, il programma deve stampare 5, in quanto 5 = 6 < 6 = 6. Presi in input 81 e, il programma deve stampare, in quanto = 81 < = 5. Esercizio 1. Un intero positivo n si dice perfetto se è uguale alla somma di tutti i suoi divisori propri. Ad esempio, 8 = 1 + + + 7 + 1 è perfetto. n si dice abbondante se la somma di tutti i suoi divisori propri è maggiore di n. Ad esempio < 1 + + + + 6 + 8 + 1 = 6 è abbondante. n si dice difettivo se la somma di tutti i suoi divisori propri è minore di n. Ad esempio 7 > 1 + + 9 = 1. Scrivere una programma C che preso in input un numero positivo n stampi 0 se n è un numero perfetto, 1 se è difettivo ed 1 se è abbondante. Esercizio 1. Dato un intero strettamente positivo n, definiamo il successivo di un naturale n > 1 come segue (1 non ha successivi): n/ se n è pari n + 1 se n è dispari > 1 1

Scrivere un programma che letto in input un numero intero positivo n produca in output il numero di passi necessari affinchè la sequenza che comincia con n raggiunga il numero 1. Esempio: La sequenza che comincia con, prosegue con 10, 5, 16, 8,,, 1: quindi in questo caso il programma dovrebbe stampare 7. Gruppo Esercizio.1 (Enigmistica: Lucchetto) Nel linguaggio enigmistico un lucchetto è un gioco caratterizzato dallo schema XY + Y Z XZ. Forse un informatico teorico direbbe piuttosto che prese tre parole (o sequenze) w 1, w, w su un certo alfabeto di simboli Σ, w è un lucchetto di w 1 e w se e solo se esistono tre parole x, y, z tale che w 1 = xy, w = yz e w = xz. Dovete scrivere un programma che legge due stringhe e produce in output il lucchetto massimale tra le due parole. Il programma deve quindi trovare la più lunga sequenza finale di w 1 che è uguale alla sequenza iniziale di w, e produrre in output il lucchetto risultante seguendo le regole sopra descritte (senza ovviamente preoccuparsi che il risultato abbia significato o meno nella lingua italiana). Esempi: Se le parole di ingresso sono uguali, il risultato è la sequenza vuota. Se non esiste nessun suffisso della prima comune a un prefisso della seconda, allora il risultato è semplicemente la concatenazione delle due parole. Ad esempio se l input fosse: rara e mente il vostro programma dovrebbe scrivere in output raramente. Attenzione però che in alcuni casi il lucchetto non è unico, ma voi dovete restituire il massimale. Ad esempio se l input fosse tono e onore dovete scrivere in output tre e non tonnore. Esercizio. (Anagrammi) Scrivere un programma C che legge in input due stringhe s 1 ed s e verifica se s 1 è un anagramma di s. In caso affermativo, stampa 1, altrimenti stampa 0. Attenzione al fatto che eventuali caratteri ripetuti devono avere lo stesso numero di occorrenze in s 1 ed s. Esempi: La stringa roma è anagramma di mora, ma non di morra. Esercizio. (MasterMind) Scrivere un programma che legge in input 0 cifre (una alla volta con scanf("%d",...);) e considera le prime dieci come una combinazione segreta del gioco del master mind, e le seconde 10 come un tentativo di indovinare la combinazione segreta. Produrre in output numeri

(su due righe diverse), tali che il primo sia il numero delle cifre corrette al posto giusto, e il secondo sia il numero delle cifre corrette, ma al posto sbagliato. Esempio: Supponiamo venga letta la seguente sequenza di cifre: 1 5 5 1 1 6 7 1 5 5 1. Va interpretata come segue: combinazione segreta: 1 5 5 1 tentativo: 1 6 7 1 5 5 1 risultato: dove significa numero giusto al posto giusto e significa numero giusto al posto sbagliato. Osservate che l ultimo 1 del tentativo non produce nessun risultato perchè ho già impegnato entrambi gli 1 della combinazione segreta. In questo caso il vostro programma dovrebbe rispondere quindi: Gruppo Esercizio.1 [Matrice a spirale]. Scrivere un programma che legge un numero intero n e crea una matrice a spirale n n. Si mette in alto a sinistra (in posizione [0,0]) il numero 1 e poi, andando in senso orario verso il centro della matrice, si dispongono gli altri numeri,,,... fino a n. Ecco ad esempio le matrici a spirale di lato e. 1 1 8 9 1 1 1 5 7 6 5 11 16 15 6 10 9 8 7 Input: un numero intero n, dimensione della matrice. Output: la matrice a spirale n n. Esercizio. [Caselle Controllate dalla Regina]. Negli scacchi, la regina si muove in tutte le direzioni (orizzontale, verticale, diagonale) di un numero di caselle a piacere. Dovete scrivere un programma che stampa le caselle in cui può muovere una regina.

Input Tre numeri interi, n, i, j, con 0 i, j < n. n è la dimensione del lato della scacchiera, mentre [i, j] è la posizione della regina. Output Una matrice di interi n n, in cui viene messo un in posizione [i, j], un 1 in tutte le posizioni raggiungibili dalla regina, e 0 nelle posizioni non raggiungibili dalla regina. Esempio Se l input fosse 5 l output sarebbe la matrice: 0 1 0 1 0 1 1 1 0 0 1 1 1 1 1 1 1 0 0 0 1 0 1 0 Esercizio. (Sudoku) Come probabilmente sapete, la soluzione di un Sudoku consiste in una matrice 9 9 contenente numeri da 1 a 9, dimodochè in ciascuna riga, ciascuna colonna e in ciascuna di 9 sottomatrici appaiano tutti una ed una sola volta (vedi figura sottostante). Dovete scrivere un programma che legge 9 stringhe di 9 caratteri (ciascun carattere è una cifra tra 1 e 9) e verifica se si tratta di una soluzione di un Sudoku. In caso affermativo, il vostro programma deve stampare 1 e viceversa stampare 0. Esempio: Qui sotto un esempio di input, il sudoku corrispondente nella usuale presentazione grafica. In questo caso, il programma dovrà stampare 1, in quanto si tratta della soluzione di un Sudoku. Input: 891576 175698 658791 716958 897615 516798 617958 958167 768159

Esercizio. Probabilmente conoscete tutti il gioco del 08 1. Una matrice contiene numeri che sono tutti potenze di due o caselle vuote. Si può muovere a destra, sinistra, alto e basso, causando lo scivolamento di tutti i numeri della matrice, facendoli occupare la posizione libera più a destra, sinistra, alto o basso libera. Ad esempio, muovendo verso destra, ogni numero occuperà la casella più a destra possibile: questo dipende da quante caselle vuote ci sono a destra, e da eventuali fusioni : infatti, se due numeri uguali si trovano adiacenti (sulla stessa riga) muovendo verso destra (o sinistra) si fondono e la casella conterrà poi la somma dei due numeri. Muovendo verso l alto o il basso vengono fusi numeri adiacenti sulla stessa colonna. Noi codificheremo in una matrice di interi una posizione del 08, con la convenzione che le caselle vuote siano rappresentate dal numero 0. Il gioco finisce quando non si possono fare ulteriori mosse: ciò accade quando si verificano entrambe le due seguenti condizioni: 1. non ci sono caselle libere;. non c è nessuna possibile fusione, in nessuna direzione (cioè non ci sono coppie di numeri uguali adiacenti in orizzontale o in verticale. Scrivere un programma C che, letta da input una matrice di interi, restituisca 1 se il gioco è finito e 0 altrimenti. Gruppo L input degli esercizi di questa sezione è costituito da un numero intero n < 100 che rappresenta il numero di nodi di un albero binario T di interi e poi da n interi, di cui i primi n sono il risultato di una visita preorder di T e i secondi n sono gli stessi interi, nell ordine ottenuto da una visita inorder di T. Sotto l ipotesi che tutti i nodi contengano informazioni distinte, è possibile ricostruire in modo univoco l albero binario T. Infatti, la visita preorder ci permette di identificare in modo univoco la radice (che è il primo elemento della visita). Nella visita inorder la radice separa gli elementi del sottoalbero sinistro da quelli del sottoalbero destro. A questo punto, è possibile ricostruire il sottoalbero sinistro e destro riapplicando ricorsivamente lo stesso ragionamento, dopo aver opportunamente selezionato le sequenze di elementi che rappresentano le visite preorder e inorder del sottoalbero sinistro e del sottoalbero destro. 1 vedi ad esempio http://it.wikipedia.org/wiki/08 (videogioco) 5

1 6 5 7 Figura 1: Albero binario nell esempio Esempio: Supponiamo di leggere come input il numero 7 e 1 numeri nel seguente ordine: - 1-5 6 7 1-5 - 6 7. L albero corrispondente è mostrato in Fig. 1. Infatti, la visita preorder ci dice che - è la radice. Dopodichè, andando a vedere la visita inorder, è possibile scoprire che 1-5 è la visita inorder del sottoalbero sinistro e 6 7 è la visita inorder del sottoalbero destro. Dato che anche nella visita preorder la visita del sottoalbero sinistro precede la visita del sottoalbero destro, possiamo dedurre che 1-5 sia la visita preorder del sottoalbero sinistro e 6 7 la visita preorder del sottoalbero destro. Ora è possibile riapplicare ricorsivamente il ragionamento considerando la coppia di visite 1-5 e 1-5 per ricostruire il sottoalbero sinistro e la coppia di visite 6 7 e 6 7 per il sottoalbero destro. Esercizio.1 Leggete un albero di interi come descritto sopra. In output, occorre produrre l albero in cui l etichetta di ciascun nodo stata sostituita con la somma delle etichette sottoalbero radicato in quel nodo. Produrre come output la sequenza di interi corrispondente a una visita inorder dell albero. Esempio: Dato in input l albero a sinistra, bisogna costruire l albero a destra e produrre in output la sua visita inorder, senza andare a capo. 1 1 5 1 Output: 1 9 5. Esercizio. Leggete un albero di interi come descritto sopra. In output, occorre produrre l albero in cui l etichetta di ciascun nodo stata sostituita con la somma delle etichette nel cammino che lega il nodo alla radice. Produrre come output la sequenza di interi corrispondente a una visita postorder dell albero. 6

Esempio: Dato in input l albero a sinistra, bisogna costruire l albero a destra e produrre in output la sua visita postorder, senza andare a capo. 1 7 6 8 9 Output: 8 7 9 6. 7