题目
有 N 个房间,开始时你位于 0 号房间。每个房间有不同的号码:0,1,2,…,N-1,并且房间里可能有一些钥匙能使你进入下一个房间。
在形式上,对于每个房间 i 都有一个钥匙列表 rooms[i],每个钥匙 rooms[i][j] 由 [0,1,…,N-1] 中的一个整数表示,其中 N = rooms.length。 钥匙 rooms[i][j] = v 可以打开编号为 v 的房间。
最初,除 0 号房间外的其余所有房间都被锁住。
你可以自由地在房间之间来回走动。
如果能进入每个房间返回 true,否则返回 false。
示例1
输入:
[[1],[2],[3],[]]
输出:
true
解释:
我们从 0 号房间开始,拿到钥匙 1。
之后我们去 1 号房间,拿到钥匙 2。
然后我们去 2 号房间,拿到钥匙 3。
最后我们去了 3 号房间。
由于我们能够进入每个房间,我们返回 true。
示例2
输入:
[[1,3],[3,0,1],[2],[0]]
输出:
false
解释:
不能进入2号房间
提示:
1 <= rooms.length <= 1000
0 <= rooms[i].length <= 1000
所有房间中的钥匙数量总计不超过 3000。
解法
- 进一间房获得钥匙,获得钥匙后又可以开门
- bfs 或者 dfs
代码
#include <stdio.h>
#include <string>
#include <iostream>
#include <queue>
#include <vector>
using namespace std;
class Solution {
public:
bool canVisitAllRooms(vector<vector<int>>& rooms) {
int n = rooms.size();
int num = 0;
vector<int> vist_r(n,0);
queue<int> q;
q.push(0);
vist_r[0] = 1; //标记进入的房间
while(!q.empty())
{
int key = q.front();//取出钥匙
q.pop();
num ++;
for(int i=0;i<rooms[key].size();i++){//进入房间里拿到钥匙
int tmp =rooms[key][i];
if(vist_r[tmp]==0){
vist_r[tmp] = 1; //能进入的房间标记为1
q.push(rooms[key][i]);
}
}
}
return n==num;
}
};
/*
class Solution {
public:
void dfs(vector<vector<int>>& rooms, vector<int>& vis,int x,int& num) {
vis[x] = 1;
num++;
for(int i=0;i<rooms[x].size();i++){
int tmp =rooms[x][i];
if (vis[tmp]==0) {
dfs(rooms, vis, tmp,num);
}
}
}
bool canVisitAllRooms(vector<vector<int>>& rooms) {
int n = rooms.size();
vector<int> vis(n,0);
int num=0;
dfs(rooms,vis,0,num);
return num == n;
}
};
*/
int main()
{
vector<vector<int>> rooms;
vector<int> r1(2,0);r1[0] = 2;r1[1] = 3;
vector<int> r2;
vector<int> r3(1,0);r3[0] = 2;
vector<int> r4(3,0);r4[0] = 1;r4[1] = 3;r4[2]=1;
rooms.push_back(r1);rooms.push_back(r4);
rooms.push_back(r3);rooms.push_back(r4);
Solution s;
cout<<s.canVisitAllRooms(rooms);
}
今天也是爱zz的一天哦!