# LC 841. Keys and Rooms
### [Problem link](https://leetcode.com/problems/keys-and-rooms/)
###### tags: `leedcode` `medium` `python` `c++` `BFS`
There are <code>n</code> rooms labeled from <code>0</code> to <code>n - 1</code>and all the rooms are locked except for room <code>0</code>. 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 <code>rooms</code> where <code>rooms[i]</code> is the set of keys that you can obtain if you visited room <code>i</code>, return <code>true</code> if you can visit **all** the rooms, or <code>false</code> otherwise.
**Example 1:**
```
Input: rooms = [[1],[2],[3],[]]
Output: true
Explanation:
We visit room 0 and pick up key 1.
We then visit room 1 and pick up key 2.
We then visit room 2 and pick up key 3.
We then visit room 3.
Since we were able to visit every room, we return true.
```
**Example 2:**
```
Input: rooms = [[1,3],[3,0,1],[2],[0]]
Output: false
Explanation: We can not enter room number 2 since the only key that unlocks it is in that room.
```
**Constraints:**
- <code>n == rooms.length</code>
- <code>2 <= n <= 1000</code>
- <code>0 <= rooms[i].length <= 1000</code>
- <code>1 <= sum(rooms[i].length) <= 3000</code>
- <code>0 <= rooms[i][j] < n</code>
- All the values of <code>rooms[i]</code> are **unique** .
## Solution 1 - BFS
#### Python
```python=
class Solution:
def canVisitAllRooms(self, rooms: List[List[int]]) -> bool:
q = deque([0])
seen = set([0])
while q:
unlock = q.popleft()
for key in rooms[unlock]:
if key not in seen:
q.append(key)
seen.add(key)
return len(seen) == len(rooms)
```
#### C++
```cpp=
class Solution {
public:
bool canVisitAllRooms(vector<vector<int>>& rooms) {
unordered_set<int> seen;
queue<int> q;
q.push(0);
while (!q.empty()) {
int key = q.front();
q.pop();
seen.insert(key);
for (int& key: rooms[key]) {
if (seen.find(key) == seen.end()) {
q.push(key);
}
}
}
return seen.size() == rooms.size();
}
};
```
>### Complexity
>n = rooms.length
>| | Time Complexity | Space Complexity |
>| ----------- | --------------- | ---------------- |
>| Solution 1 | O(n) | O(n) |
## Note
x