Leetcode-841. 钥匙和房间

题目

有 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。

解析

  • 思路:有两种方式
  • 第一通过深度优先搜索的方式,到了每一个房间就判断钥匙是否存在于已经拥有的序列中,如果不在就把他设置为可以访问。
  • 第二通过广度优先搜索的方式进行探索。将可访问的0房间加入队列之中,访问队列中的一个元素,遍历他可以到达的房间,如果该房间还没有被访问,那么设置为访问,否则跳过。

class Solution_841 {
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;
    }
};

题目来源

原文地址:https://www.cnblogs.com/ranjiewen/p/9464036.html

时间: 2024-10-28 23:15:44

Leetcode-841. 钥匙和房间的相关文章

LeetCode 841:钥匙和房间 Keys and Rooms

题目: ? 有 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 号房间外的其余所有房间都被锁住. 你可以自由地在房间之间来回走动. 如果

Leetcode Weekly Contest 86

Weekly Contest 86 A:840. 矩阵中的幻方 3 x 3 的幻方是一个填充有从 1 到 9 的不同数字的 3 x 3 矩阵,其中每行,每列以及两条对角线上的各数之和都相等. 给定一个由整数组成的 N × N 矩阵,其中有多少个 3 × 3 的 "幻方" 子矩阵?(每个子矩阵都是连续的). 直接模拟即可,本来是签到题,由于粗心,浪费了时间. 1 class Solution { 2 public: 3 int numMagicSquaresInside(vector&l

leet

# 题名1 两数之和    2 两数相加    3 无重复字符的最长子串    4 寻找两个有序数组的中位数    5 最长回文子串    6 Z 字形变换    7 整数反转    8 字符串转换整数 (atoi)    9 回文数    10 正则表达式匹配    11 盛最多水的容器    12 整数转罗马数字    13 罗马数字转整数    14 最长公共前缀    15 三数之和    16 最接近的三数之和    17 电话号码的字母组合    18 四数之和    19 删除链表

一个屌丝程序猿的人生(十五)

说是一回事,做就又是另外一回事了.毕竟林萧才17周岁,第一次带着两个女生来开房,心中还是有些紧张的,就连说话都有些不利索. “你......你好,给我......我们开一个房间吧.” 旅馆的前台是一个看起来约莫25.6岁的姑娘,一看林萧年纪这么小,还带着两个年纪差不多的女生,小脸上不禁有些惊讶.不过旅馆前台还是很快调整了一下心情,露出一丝专业的微笑说道:“好的.把你的身份证给我看一下.” “噢......好的.”林萧虽然还不满18周岁,但高考时刚好办了身份证,所以倒不算是无证青年. “你还不到1

[03] 类的结构和创建对象

1.类的结构和定义 先回顾一下,类的基本概念: 类定义了对象共同的属性和行为(即方法) 具体的某个对象需要通过类来进行申明 那么显而易见地,类中应该包含的东西就有,属性.方法,另外,既然对象要通过类来声明,那么类中必须要有一个类似生产机器的东西来生成对象,这个类似生产机器的东西叫做构造函数.另外,类还可有内部类和块,这两种使用较少. 所以,类的结构内容就是: 属性(对象数据的描述) 方法(对象的行为) 构造函数(用于生产对象,也叫做实例化对象) 内部类(在类体中申明的类) 块(分为静态块.实例块

【java7并发编程实战】—–线程同步基础:synchronized

在我们的实际应用当中可能经常会遇到这样一个场景:多个线程读或者.写相同的数据,访问相同的文件等等.对于这种情况如果我们不加以控制,是非常容易导致错误的.在java中,为了解决这个问题,引入临界区概念.所谓临界区是指一个访问共用资源的程序片段,而这些共用资源又无法同时被多个线程访问. 在java中为了实现临界区提供了同步机制.当一个线程试图访问一个临界区时,他将使用一种同步机制来查看是不是已经有其他线程进入临界区.如果没有则他就可以进入临界区,否则他就会被同步机制挂起,指定进入的线程离开这个临界区

【Java并发编程实战】—–synchronized

在我们的实际应用其中可能常常会遇到这样一个场景:多个线程读或者.写相同的数据,訪问相同的文件等等.对于这样的情况假设我们不加以控制,是非常easy导致错误的. 在java中,为了解决问题,引入临界区概念.所谓临界区是指一个訪问共用资源的程序片段,而这些共用资源又无法同一时候被多个线程訪问. 在java中为了实现临界区提供了同步机制.当一个线程试图訪问一个临界区时,他将使用一种同步机制来查看是不是已经有其它线程进入临界区. 假设没有则他就能够进入临界区,否则他就会被同步机制挂起,指定进入的线程离开

【Java并发编程实战】-----synchronized

在我们的实际应用当中可能经常会遇到这样一个场景:多个线程读或者.写相同的数据,访问相同的文件等等.对于这种情况如果我们不加以控制,是非常容易导致错误的.在java中,为了解决这个问题,引入临界区概念.所谓临界区是指一个访问共用资源的程序片段,而这些共用资源又无法同时被多个线程访问. 在java中为了实现临界区提供了同步机制.当一个线程试图访问一个临界区时,他将使用一种同步机制来查看是不是已经有其他线程进入临界区.如果没有则他就可以进入临界区,否则他就会被同步机制挂起,指定进入的线程离开这个临界区

SyncThread用法

在多线程程序中,难免会多个线程操纵一个共享变量,以模拟多个窗口共同售票为例: public class Demo {     private int num=10;     //未加synchronized修饰的sell方法     public synchronized void sell(){         if(num==0){             return;         }         num--;         System.out.println(Thread.c