题目:
- 有
n
个房间,房间按从0
到n - 1
编号。最初,除0
号房间外的其余所有房间都被锁住。你的目标是进入所有的房间。然而,你不能在没有获得钥匙的时候进入锁住的房间。 - 当你进入一个房间,你可能会在里面找到一套不同的钥匙,每把钥匙上都有对应的房间号,即表示钥匙可以打开的房间。你可以拿上所有钥匙去解锁其他房间。
- 给你一个数组
rooms
其中rooms[i]
是你进入i
号房间可以获得的钥匙集合。如果能进入 所有 房间返回true
,否则返回false
。
示例:
- 输入: r o o m s = [ [ 1 ] , [ 2 ] , [ 3 ] , [ ] ] rooms = [[1],[2],[3],[]] rooms=[[1],[2],[3],[]]
- 输出: t r u e true true
- 解释:
- 我们从 0 号房间开始,拿到钥匙 1。
- 之后我们去 1 号房间,拿到钥匙 2。
- 然后我们去 2 号房间,拿到钥匙 3。
- 最后我们去了 3 号房间。
- 由于我们能够进入每个房间,我们返回 true。
解题思路:(BFS)
定义一个数组visit
,用来标记房间是否被访问过。采用BFS算法,遍历一遍所能到达的房间,若当前遍历的房价能够到达,就将该房间在visit
置为true
。BFS之后,再遍历一遍visit
数组,若发现有false
则代表有房间无法到达,返回false
,否则返回true
。
C++版整体代码(BFS):
class Solution {
public:
bool canVisitAllRooms(vector<vector<int>>& rooms) {
int n = rooms.size();
// 标记数组
vector<bool> visit(n, false);
// 队列,用于BFS算法
queue<int> q;
// 因为是从0号房间开始遍历,将0号房间入队
q.push(0);
// 将0号房间置为true,代表可到达
visit[0] = true;
while(!q.empty()){
int tempIdx = q.front(); q.pop();
// tempRooms代表当前房间取出的其他房间的钥匙
vector<int> tempRooms = rooms[tempIdx];
// 遍历这些钥匙
for(int i = 0; i < tempRooms.size(); i++){
// 若这些钥匙中发现有房间没有到达过的钥匙,就用该钥匙进入房间
if(!visit[tempRooms[i]]){
// 将当前房间加入队列
q.push(tempRooms[i]);
// 将当前房间置为true,代表可到达
visit[tempRooms[i]] = true;
}
}
}
// 遍历一遍visit数组,若有false,代表有房间无法到达,返回false
for(int i = 0; i < n; i++){
if(!visit[i]) return false;
}
// 否则返回true
return true;
}
};