【LeetCode75】第四十三题 钥匙和房间

目录

题目:

示例:

分析:

代码:


题目:

示例:

分析:

给我们一个数组,表示对应的房间里拥有能开启的对应索引号的钥匙。

一开始我们只能进入0号房间,也就是数组里索引号为0的位置。数组索引为0的位置里的元素就是我们能拿到的钥匙,可以开启对应房间号的门。我们可以再次进入到这些能够进入的房间,再拿到房间里的钥匙......

问我们最后能不能进入到所有的房间。

那么这道题是一眼就能看出来要使用BFS或是DFS来解题的了。

那我个人比较喜欢DFS,那我就用DFS来做。

首先我们先定义一个长度为房间数量的数组,元素类型为bool类型,用来表示我们能否进入到对应的房间。

一开始我们是只能进入到0号房间,也只能拿到0号房间里的钥匙

接着我们开始递归,在递归里遍历0号房间的钥匙,如果钥匙对应的房间我们是之前就可以进入的,那么我们跳过这把钥匙,因为该房间我们现在或者是之前已经递归过了,为了剪枝,我们就跳过这把钥匙。

如果钥匙对应的房间我们之前没有进入过,那么我们将一开始定义的那个数组中对应的位置置为true表示我们可以进入。再拿到这个房间里的钥匙,开始下一轮递归......

最终DFS结束,我们检查是否所有房间都是可以进入的即可。

代码:

cpp 复制代码
class Solution {
public:
    void dfs(vector<bool>&temp,vector<vector<int>>& rooms,vector<int> key){
        for(int k:key){ //遍历我们有的钥匙
            if(temp[k]) continue;   //如果我们能进入对应的房间,那么我们之前遍历过了,这边剪枝.
            temp[k]=true;   //如果之前不能进入,那么现在可以进了,那么做个标记
            dfs(temp,rooms,rooms[k]);   //再接着递归现在进入的房间里内含的钥匙
        }
    }
    bool canVisitAllRooms(vector<vector<int>>& rooms) {
        vector<bool>temp(rooms.size(),false);   //是否能进入对应房间
        temp[0]=true;   //首先我们是可以进入到第一个房间
        dfs(temp,rooms,rooms[0]);   //dfs,传入可以进的房间,以及每个房间内含钥匙情况,和我们已经有的钥匙
        for(bool t:temp){   //遍历能否进入房间的情况,如果都可以进就返回true.
            if(!t) return false;
        }
        return true;
    }
};
相关推荐
a187927218313 分钟前
【算法】动态规划第三篇:背包第一课——贪心之死与正序倒序开关
算法·leetcode·动态规划·贪心·dp·暴力·算法讲解
hope_wisdom5 分钟前
C/C++数据结构之二叉树的遍历
c语言·数据结构·c++·二叉树·深度优先·广度优先
黄金龙PLUS12 分钟前
Xoodoo置换算法的优缺点
算法·网络安全·密码学·哈希算法·同态加密
Cccp.12316 分钟前
【leetcode】(四)排序算法汇总和链表
leetcode·链表·排序算法
LayZhangStrive44 分钟前
数据结构与算法 - 堆排序
java·数据结构·算法·排序算法·堆排序·大根堆
cpp_learner1 小时前
C++ 实现责任链模式(Chain of Responsibility):从一堆 if-else 到可插拔的处理管道
c++·设计模式
residual_fan1 小时前
深度渐进收缩学习(DPSL):面向强噪声与类内分散的机械复合故障诊断方法
人工智能·算法·数据挖掘·数据分析
一木 之林1 小时前
五、C++ 新特性、关键字与编译原理(进阶)(一)
c语言·开发语言·c++
2601_962298271 小时前
交易开拓者通常使用什么编程语言?这种语言如何帮助自动化交易?
java·c++·python·编程语言·自动化交易
码匠许师傅1 小时前
【设计模式精讲】23.备忘录模式(Memento)
c++·设计模式·软件工程·uml·备忘录模式