Non so se ai moderatori vada bene questo titolo ma non so che inventarmi.
Comunque data una matrice di boolean devo realizzare un metodo che calcola il numero di secoli
necessari ad inondare la matrice.
Mi spiego meglio, la matrice rappresenta una topografia. Le caselle false sono acqua. Le caselle
true sono terra. Una spiaggia è una casella di terra (true) che confina con almeno un'area d'acqua (false).
L'idea sarebbe questa:
Un ciclo while che chiama un metodo che si occupa di inondare man mano le spiagge. Conto il numero
di iterazioni e lo restituisco. Incollo il codice, ho un problema di ciclo infinito
codice:
public class Homework4RImpl extends Homework4R
{
public Homework4RImpl() {}
class Elemento
{
private int i;
private int j;
public Elemento(int i, int j)
{
this.i = i;
this.j = j;
}
}
public int secoliInondazione(boolean[][] topografia)
{
boolean[][] copia = this.copia(topografia); //Evito di fare side effect su topografia
int ris = 0;
while(!tuttaAcqua(copia))
{
inonda(copia);
ris++;
}
return ris;
}
private void inonda(boolean[][]topografia)
{
List<Elemento> spiagge = new LinkedList<Elemento>();
for(int i=0; i<topografia.length; i++)
{
for(int j=0; j<topografia[0].length; j++)
{
if(topografia[i][j] == true && isSpiaggia(topografia,i,j))
{
Elemento e = new Elemento(i,j);
spiagge.add(e);
}
}
}
for(int i=0; i<topografia.length; i++)
{
for(int j=0; j<topografia[0].length; j++)
{
if(topografia[i][j] == true)
{
Elemento e = new Elemento(i,j);
if(spiagge.contains(e))
{
topografia[i][j] = false;
}
}
}
}
}
private boolean isSpiaggia(boolean[][]topografia, int i, int j)
{
boolean[] confini = this.confiniBooleanVersion(topografia, i, j);
if(confini[0] == false || confini[1] == false || confini[2] == false || confini[3] == false || confini[4] == false
|| confini[5] == false || confini[6] == false || confini[7] == false)
{
return true;
}
else return false;
}
private boolean tuttaAcqua(boolean[][]topografia)
{
for(int i=0; i<topografia.length; i++)
{
for(int j=0; j<topografia[0].length; j++)
{
if(topografia[i][j] == true)
{
return false;
}
}
}
return true;
}
private boolean[][] copia(boolean[][]topografia)
{
int righe = topografia.length;
int colonne = topografia[0].length;
boolean[][] ris = new boolean[righe][colonne];
for(int i=0; i<topografia.length; i++)
{
for(int j=0; j<topografia[0].length; j++)
{
ris[i][j] = topografia[i][j];
}
}
return ris;
}
private boolean[] confiniBooleanVersion(boolean[][]topografia, int i, int j)
{
boolean uno = topografia[i-1][j-1];
boolean due = topografia[i-1][j];
boolean tre = topografia[i-1][j+1];
boolean quattro = topografia[i][j-1];
boolean cinque = topografia[i][j+1];
boolean sei = topografia[i+1][j-1];
boolean sette = topografia[i+1][j];
boolean otto = topografia[i+1][j+1];
boolean[]arr = {uno,due,tre,quattro,cinque,sei,sette,otto};
return arr;
}
}