import java.util.*;
public class Stanovanje {
public Oseba[] stanovalci;
private Stanovanje[] sosedje = {null, null, null, null};
public Stanovanje(Oseba[] stanovalci) {
this.stanovalci = stanovalci;
}
public int steviloStanovalcev() {
return this.stanovalci.length;
}
public int steviloStarejsihOd(Oseba os) {
int r = 0;
for (int i = 0; i < this.stanovalci.length; i++)
if (this.stanovalci[i].jeStarejsaOd(os))
r++;
return r;
}
public int[] mz() {
int mž[] = {0, 0};
for (int i = 0; i < this.stanovalci.length; i++)
if (this.stanovalci[i].spol == 'M')
mž[0]++;
else
mž[1]++;
return mž;
}
public Oseba starosta() {
Oseba r = null;
for (int i = 0; i < this.stanovalci.length; i++)
if (r == null || this.stanovalci[i].jeStarejsaOd(r))
r = this.stanovalci[i];
return r;
}
public void nastaviSosede(Stanovanje levi, Stanovanje zgornji,
Stanovanje desni, Stanovanje spodnji) {
this.sosedje[0] = levi;
this.sosedje[1] = zgornji;
this.sosedje[2] = desni;
this.sosedje[3] = spodnji;
}
public Oseba starostaSosescine() {
Oseba r = this.starosta();
for (int i = 0; i < this.sosedje.length; i++) {
if (this.sosedje[i] == null)
continue;
if (this.sosedje[i].starosta() == null)
continue;
if (this.sosedje[i].starosta().jeStarejsaOd(r))
r = this.sosedje[i].starosta();
}
return r;
}
public Oseba[] sosedjeSosedov() {
List<Oseba> r = new ArrayList<Oseba>();
for (Stanovanje stanovanje : this.soseščina())
r.addAll(Arrays.asList(stanovanje.stanovalci));
return r.toArray(new Oseba[0]);
}
public Set<Stanovanje> soseščina() { // soseščina na globini pravzaprav, slabo sem prebral navodilo sprva
return this.soseščina(new HashSet<Stanovanje>(), 2);
}
public Set<Stanovanje> vsa_dosegljiva_stanovanja () {
return this.soseščina(new HashSet<Stanovanje>(), Integer.MAX_VALUE);
}
private Set<Stanovanje> soseščina(Set<Stanovanje> obiskani, int globina) {
Set<Stanovanje> r = new HashSet<Stanovanje>();
if (obiskani.contains(this) || globina < 0)
return r;
if (globina == 0 || globina == Integer.MAX_VALUE)
r.add(this);
if (globina != Integer.MAX_VALUE)
globina--;
r.remove(null);
obiskani.add(this);
for (int i = 0; i < this.sosedje.length; i++)
if (this.sosedje[i] != null)
r.addAll(this.sosedje[i].soseščina(obiskani, globina));
obiskani.remove(this);
return r;
}
public Set<int[]> pozicije () {
return this.pozicije(new HashSet<Stanovanje>(), 0, 0);
}
private Set<int[]> pozicije (Set<Stanovanje> obiskani, int x, int y) {
Set<int[]> r = new HashSet<int[]>();
if (obiskani.contains(this))
return r;
r.add(new int[]{this.stanovalci.length, x, y});
obiskani.add(this);
if (this.sosedje[0] != null)
r.addAll(this.sosedje[0].pozicije(obiskani, x-1, y));
if (this.sosedje[1] != null)
r.addAll(this.sosedje[1].pozicije(obiskani, x, y+1));
if (this.sosedje[2] != null)
r.addAll(this.sosedje[2].pozicije(obiskani, x+1, y));
if (this.sosedje[3] != null)
r.addAll(this.sosedje[3].pozicije(obiskani, x, y-1));
// obiskani.remove(this);
return r;
}
public Set<Oseba[]> staroste () {
return this.staroste(new HashSet<Stanovanje>());
}
private Set<Oseba[]> staroste (Set<Stanovanje> obiskani) {
Set<Oseba[]> r = new HashSet<Oseba[]>();
if (obiskani.contains(this))
return r;
r.add(new Oseba[]{this.starosta()});
obiskani.add(this);
if (this.sosedje[0] != null)
r.addAll(this.sosedje[0].staroste(obiskani));
if (this.sosedje[1] != null)
r.addAll(this.sosedje[1].staroste(obiskani));
if (this.sosedje[2] != null)
r.addAll(this.sosedje[2].staroste(obiskani));
if (this.sosedje[3] != null)
r.addAll(this.sosedje[3].staroste(obiskani));
// obiskani.remove(this);
return r;
}
}