# 钥匙和房间
# 思路:深度遍历,
深度遍历,链表,根据题意遍历。
boolean[] via;
int next;
public boolean canVisitAllRooms(List<List<Integer>> rooms) {
via = new boolean[rooms.size()];
next = 0;
dfs(rooms, next);
return next == rooms.size();
}
private void dfs(List<List<Integer>> rooms, int n) {
via[n] = true;
next++;
for (int i : rooms.get(n)) {
if (!via[i]) {
dfs(rooms, i);
}
}
}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
广度遍历。
public boolean canVisitAllRooms1(List<List<Integer>> rooms) {
int next = 0;
boolean[] via = new boolean[rooms.size()];
Queue<Integer> queue = new LinkedList<>();
via[0] = true;
queue.offer(0);
while (!queue.isEmpty()) {
int tem = queue.poll();
next++;
for (int n : rooms.get(tem)) {
if (!via[n]) {
via[n] = true;
queue.offer(n);
}
}
}
return next == rooms.size();
}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18