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 r = new ArrayList(); for (Stanovanje stanovanje : this.soseščina()) r.addAll(Arrays.asList(stanovanje.stanovalci)); return r.toArray(new Oseba[0]); } private Set soseščina() { return this.soseščina(new HashSet()); } private Set soseščina(Set obiskani) { Set r = new HashSet(); if (obiskani.contains(this)) return r; r.addAll(Arrays.asList(this.sosedje)); 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)); obiskani.remove(this); return r; } public Set pozicije () { return this.pozicije(new HashSet(), 0, 0); } private Set pozicije (Set obiskani, int x, int y) { Set r = new HashSet(); 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; } }