1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
|
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;
}
}
|