# 钥匙和房间

# 思路:深度遍历,

深度遍历,链表,根据题意遍历。

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

广度遍历。

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