题目 钥匙和房间
要素
从房间0获取其他房间钥匙,再从有钥匙的房间中获取其他房间钥匙
Q:最后所有房间是否都可访问?
思路
定义
key:某房间的钥匙,对应该房间
visited:房间访问能否 visited[key] == 0/1 分别表示第key个房间:不可访问 /可访问
rooms:所有房间中的所有钥匙
rooms[i] :第i个房间中的所有钥匙
rooms[i][j]:第i个房间中的第j把钥匙
具体
采用DFS
从房间0开始逐个遍历其中的钥匙
对于rooms[0][I],即从房间0中检查的第i把钥匙
若该钥匙对应的房间已访问,则跳过
若未访问,则标注可访问,并对该房间中的钥匙进行遍历
可访问的房间都访问完毕后
检查每个房间是否可访问,若是,则返回true,反之false
class Solution {
public:
void dfs(int key, vector<vector<int>>& rooms, vector<int>& visited){
if(visited[key]) //对于房间key:已访问
return ;
//房间key未访问,标注访问
visited[key] = 1;
int m = rooms[key].size();//得到该房间的钥匙数目
for(int i = 0; i < m; i++)//对每个钥匙进行遍历
dfs(rooms[key][i], rooms, visited);//对每一把钥匙对应的房间进行访问
}
bool canVisitAllRooms(vector<vector<int>>& rooms) {
int n = rooms.size();
vector<int> visited(n,0);//最开始,所有房间访问记录都为0
dfs(0, rooms, visited);//从房间0开始
for(int i = 0; i < n; i++){//若所有房间都可以访问,则为true
if(visited[i] != 1)
return false;
}
return true;
}
};