class Arcipelago { private short[][] polinesia; // griglia scogli/mare final int nRighe, nCol; // non sarebbero indispensabili public Arcipelago( int nR, int nC, int densita ){ polinesia = new short[ nR ][ nC ]; nRighe = polinesia.length; nCol = polinesia[ 0 ].length; riempi( densita ); } /* Soluzione esercizio 1a */ public void riempi( int acquaInRapportoScogli ) { double k = 1.0 / ( acquaInRapportoScogli + 1 ); for (int i = 0; i < nRighe; i++) for (int j = 0; j < nCol; j++) if ( k < Math.random() ) polinesia[ i ][ j ] = 0; else polinesia[ i ][ j ] = 1; } public short[][] clone( ) { short[][] B = new short[ nRighe ][ nCol ]; // sara` la copia di lavoro for (int i = 0; i < nRighe; i++) for (int j = 0; j < nCol; j++) B[ i ][ j ] = polinesia[ i ][ j ]; return B; } public int AreaTerreEmerse( ) { int areaComplessiva=0; for ( int i = 0; i < nRighe; i++) for (int j=0; j< nCol; j++) if ( polinesia[i][j] > 0) areaComplessiva += 2; return areaComplessiva; } public int ContaIsole( ) { int nIsole=0; for ( int i = 0; i < nRighe; i++) for (int j=0; j< nCol; j++) if ( polinesia[ i ][ j ] > 0){ nIsole ++; affonda( i, j ); } for ( int i = 0; i < nRighe; i++) for (int j=0; j< nCol; j++) if ( polinesia[ i ][ j ] < 0) polinesia[ i ][ j ] *= -1; // riporta a galla return nIsole; } private void affonda( int i, int j ){ // esplora l'isola che comprende lo scoglio di coordinate i,j if ( ! bucoNellAcqua( i, j )) { // non sono nel caso base polinesia[ i ][ j ] *= -1 ; affonda( i-1, j ); // nord affonda( i, j+1 ); // est affonda( i+1, j ); // sud affonda( i, j-1 ); // ovest } } private boolean bucoNellAcqua( int i, int j ){ return i<0 || i >= nRighe || j < 0 || j >= nCol || polinesia[ i ][ j ] <= 0; } /* Quanto segue NON e' richiesto */ public void stampa() { System.out.print( "\t" ); for ( int i = 0; i < nRighe - 1; i++ ) { System.out.print( i + "\t" ); } System.out.println(nRighe-1); for (int j = 0; j < nCol; j++) { System.out.print( j + "\t" ); for (int i = 0; i < nRighe - 1; i++) { System.out.print( polinesia[ i ][ j ] + "\t" ); } System.out.println( polinesia[ nRighe - 1 ][ j ]); } } public static void main(String[] argv) { Arcipelago A = new Arcipelago( 10, 10, 2 ); A.stampa(); System.out.println( "Superficie complessiva terre emerse " + A.AreaTerreEmerse( ) ); System.out.println( "Numero d'isole dell'arcipelago: " + A.ContaIsole( ) ); } }