• (BFS DFS 图的遍历) leetcode 841. Keys and Rooms


    There are N rooms and you start in room 0.  Each room has a distinct number in 0, 1, 2, ..., N-1, and each room may have some keys to access the next room. 

    Formally, each room i has a list of keys rooms[i], and each key rooms[i][j] is an integer in [0, 1, ..., N-1] where N = rooms.length.  A key rooms[i][j] = v opens the room with number v.

    Initially, all the rooms start locked (except for room 0). 

    You can walk back and forth between rooms freely.

    Return true if and only if you can enter every room.

    Example 1:

    Input: [[1],[2],[3],[]]
    Output: true
    Explanation:  
    We start in room 0, and pick up key 1.
    We then go to room 1, and pick up key 2.
    We then go to room 2, and pick up key 3.
    We then go to room 3.  Since we were able to go to every room, we return true.
    

    Example 2:

    Input: [[1,3],[3,0,1],[2],[0]]
    Output: false
    Explanation: We can't enter the room with number 2.
    

    Note:

    1. 1 <= rooms.length <= 1000
    2. 0 <= rooms[i].length <= 1000
    3. The number of keys in all rooms combined is at most 3000.

    这个题中,就出说的是,开始的地方拿到钥匙,然后用钥匙打开对应的已经锁了的门,并拿到门的钥匙(如果有的话),然后再打开对应的锁住的门,一直到没有钥匙为止。

    可以都用BFS和DFS

    BFS代码:(C++)

    这个BFS题中,我们先把开始的地方(即rooms[0])里面的所有数加到队列中,并把rooms[0]记为已经访问过的门,然后依次遍历,并把遍历到的门记为访问过的。

    class Solution {
    public:
        bool canVisitAllRooms(vector<vector<int>>& rooms) {
            int m = rooms.size();
            int n = rooms[0].size();
            vector<bool> vis(m,false); 
            queue<int> q;
            for(int i : rooms[0]){
                q.push(i);
            }
            vis[0] = true;
            while(!q.empty()){
                int t = q.front();q.pop();
                if(!vis[t]){
                    for(int i : rooms[t]){
                        q.push(i);
                    }
                    vis[t] = true;
                }
            }
            for(int i = 0; i < m; i++){
                if(vis[i] == false)
                    return false;
            }
            return true;
        }
    };

    DFS解法,参考Grandyang的博客:https://www.cnblogs.com/grandyang/p/10415773.html

    class Solution {
    public:
        bool canVisitAllRooms(vector<vector<int>>& rooms) {
            unordered_set<int> s;
            dfs(rooms,s,0);
            return s.size() == rooms.size();
        }
        void dfs(vector<vector<int> > &rooms,unordered_set<int> &s,int cur){
            s.insert(cur);
            for(int i : rooms[cur]){
                if(!s.count(i))
                    dfs(rooms,s,i);
            }
        }
    };
  • 相关阅读:
    判断当前是否运行于Design Mode
    从Setting.settings到Resource.resx
    构造函数强制使用new
    getFullYear 方法
    前端开发中经常使用到的20个正则表达式。
    函数调用模式
    javascript中return的作用
    javascript数组遍历for与for in区别详解
    闭包
    js split 的用法和定义 js split分割字符串成数组的实例代码
  • 原文地址:https://www.cnblogs.com/Weixu-Liu/p/10879745.html
Copyright © 2020-2023  润新知