summaryrefslogtreecommitdiffstats
path: root/šola/p1/dn/7/Stanovanje.java
blob: cafc24607bbafef68b6904b39dec1314d48a2624 (plain) (blame)
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[] = {0, 0};
		for (int i = 0; i < this.stanovalci.length; i++)
			if (this.stanovalci[i].spol == 'M')[0]++;
			else[1]++;
		return;
	}
	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;
	}
 }