美文网首页
深度优先搜索系列三-LeetCode 841钥匙和房间

深度优先搜索系列三-LeetCode 841钥匙和房间

作者: 徐慵仙 | 来源:发表于2020-01-20 14:48 被阅读0次

    题目

    https://leetcode-cn.com/problems/keys-and-rooms/

    钥匙和房间

    简析

    这个题比较简单,从0开始,逐个向下搜索就可以了,借助一个数组b[1001]标记能打开的房间,搜索的时候打开了i号房间,b[i]设置为1;搜索结束后,判断数组b中是否还有为0的,如果还有,就返回flase。

    第一步 for循环范围

    当然是第k个房间里的每一个数啦:

    for(int i=0;i<rooms[k].size();i++)
    

    第二步 判断能不能用

    • 钥匙都拿到手了,还有什么不能开门的。
    • 但是,要判断这个门开过没,钥匙开过了,就不要再开了,不然就死循环了
    for(int i=0;i<rooms[k].size();i++){
                if(b[rooms[k][i]]==0){
                    
                }
    }
    

    第三步 if成立后的处理

    • 把钥匙对应的门标记为开过,b[i]=1
    • 去开那个门,search那个门,
    • 无需回溯
    for(int i=0;i<rooms[k].size();i++){
                if(b[rooms[k][i]]==0){
                    b[rooms[k][i]]=1;
                    search(rooms,rooms[k][i]);
                }
    }
    

    完整代码

    class Solution {
    public:
        int b[1001]={0};
        bool canVisitAllRooms(vector<vector<int>>& rooms) {
            b[0]=1;
            search(rooms,0);
            for(int i=0;i<rooms.size();i++)
                    if(b[i]==0) return false;
            return true;
        }
        void search(vector<vector<int>>& rooms,int k){
            for(int i=0;i<rooms[k].size();i++){
                if(b[rooms[k][i]]==0){
                    b[rooms[k][i]]=1;
                    search(rooms,rooms[k][i]);
                }
            }
        }
    };
    

    相关文章

      网友评论

          本文标题:深度优先搜索系列三-LeetCode 841钥匙和房间

          本文链接:https://www.haomeiwen.com/subject/tpujzctx.html