此题可以通过维护一个栈,将到过的每个房间的钥匙push进去,每次访问栈顶的房间并标记,防止重复进入一个房间,在访问时再将用过的钥匙pop出去即可。
class Solution {
public:
bool canVisitAllRooms(vector<vector<int>>& rooms) {
int cnt=0;
int n=rooms.size();
vector<int>sta(n,0);
stack<int>keys;
keys.push(0); //初始化第一个房间
int key;
while(cnt!=n)
{
if(!keys.empty()) //如果没有被访问过
{
key=keys.top(); //获取钥匙
keys.pop(); //从栈顶弹出
}
else break;
if(sta[key]==0)
{
for(int i=0;i<rooms[key].size();i++) keys.push(rooms[key][i]); //将钥匙收录
sta[key]=1; //标记访问过了
cnt++; //访问的房间加1
}
}
return cnt==n;
}
};
其实此题也可以用bfs递归遍历,不过本质上和用栈维护是一个道理。