LeetCode 752 打开转盘锁

  • 分析
    BFS的题目,这道题搞懂,基本上BFS的题目就没啥问题了。如果我们不管所有的限制条件,不管deadends和target的限制,就思考一个问题:如何让你设计一个算法,穷举所有可能的密码组合,怎么做?很简单,使用穷举,再简单一点,如果你只转一下锁,有几种可能?总共有4个位置,每个位置可以向上转,也可以向下转,也就是有8种。也就是转一次可以出多少种结果,思考从“0000”转2次可以有多少种结果。到这来应该有解决这个问题的思路了。但是需要注意的是,可能需要进行去重,比如“0000”转一次可能是“1000”,而“1000”转一次又可以是“0000”。而“0000”我们已经访问过了。
  • 代码
class Solution {
public:
    int openLock(vector<string>& deadends, string target) {  

        if(find(deadends.begin(), deadends.end(), "0000") != deadends.end()) return -1;
        //去重需要judge
        unordered_map<string, bool> judge;
        queue<string> que;
        que.push("0000");
        judge["0000"] = true;
        int step = 0;

        while(!que.empty()){
            int size = que.size();            

            while(size--){
                string s = que.front();
                que.pop();

                if(s == target){
                   return step;
                }

                for(int i = 0; i < 4; i++){
                    string temp = up(s, i);
                    if(!judge[temp] && find(deadends.begin(), deadends.end(), temp) == deadends.end()) que.push(temp);
                    judge[temp] = true;
                    
                    temp = down(s, i);
                    if(!judge[temp] && find(deadends.begin(), deadends.end(), temp) == deadends.end()) que.push(temp);             
                    judge[temp] = true;       
                }
            }
            step++;
        }
        return -1;
    }

    string up(string s, int i){
        if(s[i] == '9'){
            s[i] = '0';
        }else{
            s[i] += 1;            
        }

        return s;
    }

    string down(string s, int i){
        if(s[i] == '0'){
            s[i] = '9';
        }else{
            s[i] -= 1;            
        }

        return s;
    }
};
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值