841. Keys and Rooms

There are n rooms labeled from 0 to n - 1 and all the rooms are locked except for room 0. Your goal is to visit all the rooms. However, you cannot enter a locked room without having its key.

When you visit a room, you may find a set of distinct keys in it. Each key has a number on it, denoting which room it unlocks, and you can take all of them with you to unlock the other rooms.

Given an array rooms where rooms[i] is the set of keys that you can obtain if you visited room i, return true if you can visit all the rooms, or false otherwise.
 

Example 1:
Example 2:
Constraints:
  • n == rooms.length
  • 2 <= n <= 1000
  • 0 <= rooms[i].length <= 1000
  • 1 <= sum(rooms[i].length) <= 3000
  • 0 <= rooms[i][j] < n
  • All the values of rooms[i] are unique.

From: LeetCode
Link: 841. Keys and Rooms


Solution:

Ideas:
  1. Use an array to keep track of whether a room has been visited.
  2. Perform DFS starting from room 0.
  3. In the DFS function, mark the current room as visited.
  4. For each key in the current room, if the corresponding room has not been visited, visit it.
  5. After the DFS, check if all rooms have been visited.
Code:
void dfs(int** rooms, int roomsSize, int* roomsColSize, bool* visited, int room) {
    visited[room] = true; // Mark the current room as visited
    for (int i = 0; i < roomsColSize[room]; i++) {
        int key = rooms[room][i];
        if (!visited[key]) {
            dfs(rooms, roomsSize, roomsColSize, visited, key);
        }
    }
}

bool canVisitAllRooms(int** rooms, int roomsSize, int* roomsColSize) {
    bool visited[roomsSize]; // Array to keep track of visited rooms
    for (int i = 0; i < roomsSize; i++) {
        visited[i] = false; // Initially, no room is visited
    }

    dfs(rooms, roomsSize, roomsColSize, visited, 0); // Start DFS from room 0

    // Check if all rooms have been visited
    for (int i = 0; i < roomsSize; i++) {
        if (!visited[i]) {
            return false; // If any room is not visited, return false
        }
    }

    return true; // All rooms visited
}
01-28 07:12