LABORATORIO 9 - ARRAY MULTIDIMENSIONALI ======================================= Esercizio 1 =========== Scrivere una classe Matrici che disponga dei seguenti metodi statici: - int[][] creaMatrice(int r, int c, int max) che restituisce una matrice r x c i cui valori sono numeri interi casuali tra 0 e max - int sommaMatrice(int[][] m) che, data una matrice m, restituisce la somma di tutti i suoi elementi - void stampaMatrice(int[][] m) che emette nel flusso d'uscita la matrice m, riga per riga - boolean simmetrica(int[][] m) che, data una matrice quadrata m, restituisce true se la matrice e` simmetrica rispetto alla diagonale principale, false altrimenti. Se la matrice non e` quadrata, restituisce false - un metodo main che invoca e testa i metodi della classe ________________________________________________________________ Crivello di Eratostene ====================== Il Crivello di Eratostene e` una tecnica per calcolare i numeri primi. Si disegna una tabella 10x10 con i numeri da 1 a 100 ordinati I numeri possono essere liberi o cancellati. Inizialmente tutti i numeri sono liberi, eccetto l’1 che e` cancellato (non essendo numero primo, per definizione) Si sceglie il primo numero libero (il 2, al primo giro) e si cancellano tutti i suoi multipli (4,6,8,...) Si sceglie il successivo numero libero (questa volta il 3) e si cancellano tutti i suoi multipli che non siano gia` stati cancellati (9,15,21,...) Si procede in questo modo fino alla fine della tabella Alla fine i numeri non cancellati saranno tutti e soli i numeri primi tra 0 e 100. Implementare una classe CrivelloDiEratostene usando una matrice 10x10 e visualizzare la matrice risultante al termine dell’esecuzione in forma tabellare Nota. Per visualizzare la matrice in forma tabellare può essere utile il metodo printf di System.out (oggetto di tipo PrintStream), che permette di specificare la formattazione: PrintStream printf(String format, Object... args) La sintassi generale per specificare la formattazione è: %[argument_index$][flags][width][.precision]conversion Questo semplice esempio, che fa al caso nostro, int n = 10; System.out.printf ("Numero:%5d", n); System.out.println(); System.out.println("Numero:12345"); produce: Numero: 10 Numero:12345 dove e` riservato lo spazio di 5 caratteri per stampare il numero n. (%d per stampare int, 5 in questo caso e` la dimensione dello spazio riservato) ________________________________________________________________ Campo minato ============ Descrizione ----------- Campo minato è un ben noto gioco di strategia in cui il giocatore deve individuare la posizione di alcune mine in un campo di battaglia rappresentato come una matrice di possibili posizioni. Un ingrediente fondamentale del gioco è determinare, per ogni posizione del campo, quante mine si trovino in posizioni adiacenti ad essa; per ciascuna posizione si considerano adiacenti le (al più) otto posizioni che si ottengono spostandosi di una riga e/o di una colonna nella matrice. Ad esempio, nella matrice ........ ..BBB... ..BAB... ..BBB... ........ ......DD ......DC le otto posizioni adiacenti a quella marcata con la lettera A sono marcate con la lettera B; evidentemente, le posizioni sui bordi hanno meno di otto posizioni adiacenti, fino ad un minimo di tre, come nel caso della posizione marcata con la lettera C che ha per adiacenti le posizioni marcate con la lettera D. Scrivere un programma CampoMinato che, dato su linea di comando un argomento n che specifica la dimensione di un campo minato quadrato, legge da standard input n righe di n caratteri ciascuna che rappresentano un campo minato, dove le posizioni libere sono rappresentate da un punto e le mine da un asterisco. Il programma non deve fare nessun controllo sulla correttezza dell'input. Il programma stampa una matrice che abbia un asterisco in corrispondenza di ogni mina e, in corrispondenza delle posizioni senza mine, un numero (compreso tra 0 e 8) pari a quante mine sono contenute nelle posizioni adiacenti del campo. Ad esempio, dato in ingresso il campo minato *... .... .*.. .... va stampata la matrice *100 2210 1*10 1110 Per capire meglio l'output, consideriamo la matrice XX.. YX.. XX.. .... il 2 presente nella soluzione nella posizione corrispondente alla lettera Y indica il fatto che nelle posizioni adiacenti, marcate con la lettera X, ci sono complessivamente 2 mine. Vincoli ------- Il campo minato ha dimensione massima pari a 1000 x 1000. Esempio ------- Eseguendo $java CampoMinato 8 su input .*.*.*.* ........ ***..... .......* ........ ..**.... ..**.... .......* il programma emette 1*2*2*2* 34422121 ***10011 2321001* 01221011 02**2000 02**2011 0122101* Suggerimenti ------------ - Per contare il numero di mine adiacenti a una posizione (r,c) in un campo M conviene definire un metodo (statico) mina che, dati due interi i e j, restituisca: - 1 se i corrisponde a una riga di M, j corrisponde a una colonna di M e nella posizione (i, j) di M c'è un asterisco; - 0 altrimenti. - Conviene inoltre definire un altro metodo statico contaMine che, dati due interi r e c, restituisca il numero di mine presenti nel campo nelle celle adiacenti alla cella di posizione (r, c).