有 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. 1 <= rooms.length <= 1000
  2. 0 <= rooms[i].length <= 1000
  3. 所有房间中的钥匙数量总计不超过 3000

/*
算法思想:
有两种方式,
第一通过深度优先搜索的方式,到了每一个房间就判断钥匙是否存在于已经拥有的序列中,如果不在就把他设置为可以访问。
第二通过广度优先搜索的方式进行探索。将可访问的0房间加入队列之中,访问队列中的一个元素,遍历他可以到达的房间,如果该房间还没有被访问,那么设置为访问,否则跳过。
*/
//算法实现:
class Solution {
public:
bool canVisitAllRooms(vector<vector<int>>& rooms) {
queue<int> que; //队列装的是房间号
int n = rooms.size();
vector<bool> visit(n,false);
que.push(0);
visit[0] = true;
while (!que.empty())
{
int temp = que.front(); //取出当前能到达的房间号
que.pop();
for (int i = 0; i < rooms[temp].size();i++) //遍历当前房间里面的能打开房间的钥匙
{
int next = rooms[temp][i];
if (!visit[next]) //还没有被访问
{
visit[next] = true; //不要忘记,标记为已经访问过
que.push(next);
}
}
} for (int i = 0; i < n;i++)
{
if (visit[i]==false)
{
return false;
}
}
return true;
}
};

最新文章

  1. SQL Tuning 基础概述08 - SQL Tuning Advisor
  2. T3 任职定级面试准备
  3. RCNN--对象检测的又一伟大跨越 2(包括SPPnet、Fast RCNN)(持续更新)
  4. MYSQL常见错误及其解决方式
  5. 简谈Java的join()方法
  6. [原]网络库libevent在Visual Studio中的使用方法
  7. 【POJ 1988】 Cube Stacking (带权并查集)
  8. JDK动态代理实现原理--转载
  9. js中Object.__proto__===Function.prototype
  10. CRM 数据查重
  11. Kali2.0的简单使用--开启root用户登录
  12. .NET笔试题集(五)
  13. C# 之HTTP请求get,post带重试参数
  14. JavaScript——引用类型之数组
  15. 170714、springboot编程之多数据源切换(动态)
  16. bzoj1009GT考试
  17. Red Hat Enterprise Linux上配置SQL Server Always On Availability Group
  18. Windos Server 2008 Tomcat 安装
  19. eurekaclient向eurekaserver注册使用真实ip设置
  20. BZOJ 2333 [SCOI2011]棘手的操作 (可并堆)

热门文章

  1. 微软面试题:剑指 Offer 51. 数组中的逆序对 Hard 出现次数:3
  2. 【运行机制】 JavaScript的事件循环机制总结 eventLoop
  3. 函数动态参数 *args **kwargs
  4. .NET5下的三维应用程序开发
  5. 20201205-2 HTML概念与版本
  6. 学好Spark/Kafka必须要掌握的Scala技术点(二)类、单例/伴生对象、继承和trait,模式匹配、样例类(case class)
  7. maven中引入jstl
  8. clang-format 数组初始化,多行模式
  9. [日常摸鱼]bzoj1968 [Ahoi2005]COMMON 约数研究
  10. C#数据结构-赫夫曼树