LeetCode 752. 打开转盘锁

news2024/11/24 2:42:21

今天在看bfs模板的时候看到了一个题目,解密码锁的这道题,半天也没啥思路和行动力,看了人家的java版的注释,花了40分钟才搞懂这个题,也真的是菜。写完之后发现这个题目还可以去优化,用双向bfs去解决,我就先把最初一般的传统bfs写在这里记录一下,双向的等后面再学习补充把。整体代码写起来也挺麻烦的。

bfs放在二叉树里就是层序遍历,放在图就是一个结点向四周发散,求最短路径的时候一般都bfs,dfs一般都拿递归来整,深度的,一条路走到死

这道题要求最少的转动次数。那就用bfs来套

下面我就直接说思路:

  1. 我们首先要把所有可能的密码穷举出来,我们就需要考虑4位密码数字怎么去拨动
  2. 两种拨动的方法,一种向上拨动,一种向下拨动
  3. 0和9的拨动要特殊处理一下
  4. 在主函数里面我们需要一个集合去记录题目中所给的死亡密码,这样才能在我们拨动的时候去判断,当我们拨动一串密码的时候就需要在这个集合里面去找,看这次如果拨动了是不是死亡密码,如果是了我们就需要跳出这次的循环去看下一个位置
  5. 同样的我们需要一个集合去记录已经试过但是不正确的密码,每次拨动新密码的时候,都需要判断看下这个密码是不是我们之前拨动过得,如果没有拨动过,才将此密码加入队列中,并将其记录为历史
  6. 当判断其不是死亡密码,并且把周围结点密码加入队列之后,说明这一次的拨动是暂时成功的,我们次数就要+1
  7. 当在向四周寻找结点过程中,如果碰到目标密码了就返回次数即可

下面我把代码粘出来照着思路和我的注释看懂没问题,

class Solution {
public:
    string upone(string &s,int j)
    {
       string ch=s;
       if(ch[j]=='9')
       {
           ch[j]='0';
       }
       else
       ch[j]+=1;
       return ch;
    }
    string downone(string &s,int j)
    {
       string ch=s;
       if(ch[j]=='0')
       {
           ch[j]='9';
       }
       else
       ch[j]-=1;
       return ch;
    }
    int openLock(vector<string>& deadends, string target) {
        unordered_set<string>dead;//死亡密码
        dead.insert(deadends.begin(),deadends.end());//把死亡密码加入集合
        if(dead.count("0000"))//如果死亡密码里面有初始值,那就肯定失败了
        {
            return -1;
        }
        unordered_set<string>past;//一个集合用来记录已经访问过的密码
        queue<string>qq;
        int step=0;//解锁步数
        qq.push("0000");
        past.insert("0000");
        while(!qq.empty())
        {
            int sz=qq.size();
            for(int i=0;i<sz;++i)
            {
                string tmp=qq.front();
                qq.pop();
                if(dead.count(tmp))//看有没有碰到死亡密码
                {
                    continue;
                }
                if(tmp==target)//可以解锁了
                {
                    return step;
                }
                /* 将一个节点的未遍历相邻节点加入队列 */
                for(int j=0;j<4;++j)
                {
                    string up=upone(tmp,j);
                    if(!past.count(up))//如果拨动的这个密码没在历史记录里
                    {
                        qq.push(up);//放入队列
                        past.insert(up);//放入历史记录
                    }
                    string down=downone(tmp,j);
                    if(!past.count(down))
                    {
                        qq.push(down);
                        past.insert(down);
                    }
                }
            }
            step++;
        }
        //如果没有返回,就返回-1
        return -1;

    }
};

记录一下这个麻烦题,最近刷题刷的头疼太难了

新增补充: 双向bfs

多提一嘴力扣真的是牛人出在民间,好多题解写的比官方强的太多太多了,官方好多题解啃不动,看代码还可以害。

752. 打开转盘锁 - 力扣(Leetcode)

752. 打开转盘锁 - 力扣(Leetcode)

这里粘了两个牛人的双向bfs能达到双百的代码,第一个大神写了解析,我看懂了什么是双向bfs也把代码逻辑实现算是看懂了,但是要我写肯定还是写不出来,第二个大神看了一半看不下去了,当时自己心情烦躁唉。

这篇文章反正也没人看,我就纯记录一下,写这道题的时候和写这篇博客的时候我心情很烦躁啊,唉觉得自己很菜。因为最近一直在刷题有的还行但大多都是有点思路但是写不对,看了人家的代码思路秒懂,然后写出来但是总感觉这并不是自己的,就好像把人家的代码背过了一样,思路虽说学到了一些吧但是刷题还是不会的站大多数。刷的我真的很烦躁唉,今天和老妈打视频也没什么好态度自己心情差的一批,我知道这样不好。但是这些情绪此时此刻我就发泄在这里把。希望我能快点缓过来。

等回头再来看看这个题解,希望能有另一番感悟!

沮丧.. 

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/5253.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

Android App开发超实用实例 | 约束布局

从多个角度介绍约束布局设计中的控件定位。 01、约束布局基础 从 Android Studio 2.3版本起&#xff0c;约束布局是Android Studio布局文件的默认布局。其他布局方式在实现复杂一些的布局设计时存在多种或多个布局嵌套的情况&#xff0c;设备调用这样的布局文件就需要花费更多…

(未整理完)十月每日一题打卡

每日打卡 10.1 [重新格式化电话号码 lc1694](1694. 重新格式化电话号码 - 力扣&#xff08;LeetCode&#xff09;) 模拟题&#xff1a;特殊情况就是在最后划分完全部三个之后&#xff0c;还剩四个需要变成aa-bb class Solution { public:string reformatNumber(string number…

Redis系列:Redis主从、哨兵、集群介绍

本篇内容包括&#xff1a;Redis 主从架构、Redis 哨兵架构、Redis 集群架构 的介绍等内容&#xff5e; 文章目录一、Redis 主从架构1、Redis 主从架构2、主从架构原理二、Redis 哨兵模式1、Redis 哨兵模式2、Redis 哨兵模式工作过程三、Redis 集群模式1、Redis 集群模式2、Redi…

【树莓派不吃灰】基础篇⑲ 搭建usb摄像头MJPG-streamer图片流监控,支持远程视频监控访问

目录1. 前言2. 识别摄像头3. MJPG-streamer方案3.1 什么是 MJPG&#xff1f;3.2 MJPG 的优点&#xff1f;3.2 MJPG 的缺点&#xff1f;4. 搭建usb摄像头监控4.1 开启树莓派摄像头开关4.2 查看设备文件4.3 安装必要的库4.4 下载 mjpg-streamer 安装文件4.5 切换到 /mjpg-streame…

基于51单片机的温度甲烷监测报警串口上报proteus仿真原理图PCB

功能介绍&#xff1a; 0.本系统采用STC89C52作为单片机 1.LCD1602液晶实时显示当前温度和甲烷浓度 2.超过甲烷浓度阈值&#xff0c;蜂鸣器报警 3.按键可更改甲烷浓度阈值上限和启动/暂停检测 4.020%浓度&#xff0c;绿色LED点亮 20%~阈值上限&#xff0c;黄色LED点亮&#xff0…

C#操作modbus

modbus使用范围广泛&#xff0c;广泛应用于各类仪表&#xff0c;PLC等。 modbus的好处是免费&#xff0c;属于应用层协议&#xff0c;底层硬件基于485/以太网。 modbus协议本质还是自定义协议。 modbus调试软件&#xff1a; mthings: modbuspoll: 主站/从站&#xff0c;客…

前端静态页面基本开发思路(一)

有不少刚入门前端的同学经常问我前端布局的问题&#xff0c;总是跟我说在面对学校布置的作业或者想自己搭建博客的时候不知道怎么下手&#xff0c;不知道怎么去写静态的页面&#xff0c;每当我解决了一个又一个同学的问题的时候&#xff0c;又有新的同学来问&#xff0c;故思来…

nginx 配置防盗链(了解)

一 防盗链 1.1 防盗链概念 网站上页面的一些静态资源&#xff0c;不想让本站点的静态资源被他人盗取访问。使用nginx判断请求连接的头部refer中是否含有内容以及合法性来进行处理。 referer表示第二次资源的来源地址 1.2 配置规则 valiad_referers none|blocked|server_na…

Spring--IOC基于XML管理bean

IOC容器 IOC思想 IOC&#xff1a;Inversion of Control 即反转控制 获取资源的传统方式 自己做饭&#xff1a;买菜、洗菜、择菜、改刀、炒菜&#xff0c;全过程参与&#xff0c;费时费力&#xff0c;必须清楚了解资源创建整个过程中的全部细节且熟练掌握。 在应用程序中的组件…

Antd表格性能优化

今天来分享一个实际项目的性能优化的内容。 文章目录一、背景介绍二、性能问题原因及解决方案一、背景介绍 国内React项目大多数人选择配套的UI库的时候都会选择Antd。如果是非常简单的页面用Antd的话其实是完全没问题的&#xff0c;性能感觉不到什么瓶颈&#xff0c;样式也还…

计算机网络

目录 介绍 组成部分 工作方式 功能组成 网络范围分类 传输技术&#xff1a; 总结 标准化工作 RFC文档的作用&#xff1a; 速率&#xff0c;带宽 有容量和速率的区别 带宽 吞吐量 时延&#xff0c;时延带宽积 1.发送时延&#xff1a; 2.传播时延&#xff1a; ​编辑 3.…

Vant组件库 引入 阿里矢量图 添加自己喜欢的 ICON

&#x1f4c3;目录跳转一.矢量图下载&#x1f4a8;使用CDN方式&#x1f389;下载本地&#xff08;推荐&#xff09;二.Vant引入Icon&#x1f5fa;️&#x1f383; 使用方式&#x1f680; 运行效果&#xff1a;一.矢量图下载 &#x1f4a8;使用CDN方式 当然你也可以使用官方的C…

【编程题】【Scratch三级】2021.12 分身术

分身术 1. 准备工作 (1)删除小猫角色、添加角色“Monkey”,Money位于舞台的中心; (2)添加背景Light; (3)新建变量“编号”。 2. 功能实现 (1)程序开始时,Monkey说:“我会分身术!变!!!”2秒; (2)每隔2秒克隆出一个位置随机、大小随机、颜色随机的Monke…

python easygui修改窗口位置

EasyGui是一个十分简单的Python图形界面库&#xff0c;支持窗口文本显示、图片显示、按钮、文本框、选项栏、文件选择等等必要的组件且操作十分简单。但也因如此&#xff0c;导致EasyGui甚至不能手动调整窗口位置、按钮位置、名字等&#xff0c;因为EasyGui是基于Tkinter编写的…

VMware三种网络模式详解

VMware三种网络模式 linux重启网络服务命令&#xff1a; service network restart 一、桥接模式 原理&#xff1a;VMware和宿主机&#xff0c;处于同一网段、两者地位平等。&#xff08;无需虚拟网卡&#xff09; 1.1、使用方法 虚拟网络编辑器 虚拟机设置-适配器 上面两…

<Linux> 编译器与调试器—gcc/g++/gdb 的使用

< Linux > 编译器与调试器—gcc/g/gdb 的使用 文章目录< Linux > 编译器与调试器—gcc/g/gdb 的使用一、Linux编译器 - gcc/g 使用1. 编译程序的四个过程背景知识预处理编译汇编链接2. 链接方式与函数库2.1 动态链接与静态链接2.2.函数库2.3.动态库与静态库3. gcc/…

干货分享:谷歌主动搜索开发客户的万能公式

大家在用谷歌(Google)开发是不是也有以下常见问题&#xff1a; 关键词不准&#xff0c;搜索到的都是零售商&#xff0c;B2C平台搜索到的客户太大&#xff0c;已经被开发多次&#xff0c;开发信不回复搜索到的客户找不到邮箱搜索到的客户与工厂不匹配&#xff0c;无法合作 其实…

车路协同 智能路侧设备网络安全接入技术要求

1 范围 本文件包含智能路侧设备网络安全接入技术要求&#xff0c;包括智能路侧设备连接要求、接入要求、证书管理要求。 本文件适用于智能路侧设备网络安全接入的设计与开发。 2 规范性引用文件 下列文件中的内容通过文中的规范性引用而构成本文件必不可少的条款。其中&…

Simulink永磁同步电机控制仿真:过调制及电流重构

在一些高功率密度的应用场景中&#xff0c;追求极致的电压利用率&#xff0c;这个时候要用到过调制技术&#xff1b;当svpwm工作在过调制区域时&#xff0c;逆变电桥会在一个基波周期内多次达到100%占空比&#xff0c;且较多时间处于较高的占空比&#xff0c;这个时候下桥臂电流…

数据结构系列学习(七) - 链栈(Chain_Stack)

目录 引言&#xff1a; 学习&#xff1a; 代码实现&#xff1a; 头文件&#xff08;Chain_Stack.h&#xff09;&#xff1a; 设置链栈中的元素范型&#xff1a; 链栈的结构体设计&#xff1a; 所有功能函数的声明&#xff1a; 源文件&#xff08;Chain_Stack.cpp&#…